Stack Overflow em Português Asked by Máttheus Spoo on December 4, 2020
Enquanto estudava um pouco mais sobre objetos, me deparei com coisas como new String
, new Number
, etc.
Fiquei curioso, e fui aprender. Entendi o funcionamento, apesar de ter minhas dúvidas sobre a utilidade dos mesmos, haja visto que meu conhecimento ainda não é muito grande. Mas até aí, tudo bem.
Então me deparei com o new Object()
. Fiquei confuso. Pensei que se ele existe, deve haver uma diferença ao invés de declarar com um simples {}
, mas ao que parece, não há.
Se não há diferenças entre fazer um e fazer outro, qual a utilidade da sintaxe mais longa? Qual a razão pela qual esse construtor foi criado?
A pergunta deveria ser "por que não deveria ter new Object()?
".
Ao contrário do que muita gente pensa (mesmo que diga que não pensa assim), a construção da linguagem segue uma lógica, tem uma gramática.
Isso é bom para o programador (de verdade) aprender mais facilmente e poder usar a intuição (com muito cuidado) para entender tudo como funciona nela, e pode ser mais fácil usar. É o mesmo de aprender uma língua normal (eu sei que muitos só decoram palavras e frases, mas muitos vão evoluindo o conhecimento de forma natural e progressiva, sempre entendendo o que está falando, o que faz com que ela entenda o todo, o conceito e não apenas as palavras, afinal se não for assim é uma forma de analfabetismo funcional), salvo regras de exceção necessárias por algum motivo as construções seguem uma lógica.
Também é bom para a construção do compilador que precisa tratar tudo de forma consistente e linear, ou seja, não precisa ficar inventando regras fora do normal sem necessidade.
Então se você pode usar o construtor para diversos objetos específicos para outros tipos, porque não deveria poder usar para o objeto genérico? Pra que fazer a exceção disso? Toda exceção precisa ser justificada. Criaram o construtor, não o construtor de Object
.
Lembrando que pode (ou não) passar um parâmetro para esta função construtora. Em outros tipos é bastante comum que tenha parâmetros e faz muito mais sentido. Aliás, o literal dos outros tipos é justamente new <Tipo>([param])
. Novamente, pra que esconder o construtor de um tipo específico? Então nem sempre são idênticos.
Não deveria, mas alguém poderia sobrepor o Object
padrão em alguma situação anormal. E tem diferença pra uso normal. Se não tivesse nada diferente alguém poderia argumentar para não usar algo que é claramente pior (e aparentemente é pior até em performance, pelo menos em alguma implementação e situação específica), mas seria ideologia.
Vendo uma resposta aqui que diz que ambos são equivalentes, significa ser semanticamente equivalente, não que dê o mesmo resultado (isso até dá) e da mesma forma.
É uma questão de simetria. A construção de linguagens, especialmente de programação, precisam ser pragmáticas, você ganhou ele "de graça" e para não ter haverá um custo, então melhor deixar ali. Vai que alguém acha um motivo pra usar, ou arrumem uma otimização ou função que não muda a semântica do seu uso padrão e legado porém fornecendo alguma vantagem?
Existe por pragmatismo. Retirá-lo seria ideologia.
Correct answer by Maniero on December 4, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP