TransWikia.com

Qual a utilidade / razão da existência de new Object();?

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?

One Answer

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP