Em JavaScript, qual é a diferença entre estes dois exemplos:
Pré-requisito:
function SomeBaseClass(){
}
SomeBaseClass.prototype = {
doThis : function(){
},
doThat : function(){
}
}
Exemplo de herança A usando Object.create:
function MyClass(){
}
MyClass.prototype = Object.create(SomeBaseClass.prototype);
Exemplo de herança B usando a nova palavra-chave
function MyClass(){
}
MyClass.prototype = new SomeBaseClass();
Ambos os exemplos parecem fazer a mesma coisa. Quando você escolheria um sobre o outro?
Uma pergunta adicional: considere o código no link abaixo (linha 15), onde uma referência ao construtor da própria função é armazenada no protótipo. Por que isso é útil?
https://github.com/mrdoob/three.js/blob/master/src/loaders/ImageLoader.js
Trecho (se você não deseja abrir o link):
THREE.ImageLoader.prototype = {
constructor: THREE.ImageLoader
}
javascript
inheritance
object-create
ChrisRich
fonte
fonte
Object.create
. Isso é um erro e deve ser reaberto.Respostas:
Na sua pergunta, você mencionou que
Both examples seem to do the same thing
isso não é verdade, porqueSeu primeiro exemplo
Neste exemplo, você está apenas herdando,
SomeBaseClass' prototype
mas e se você tiver uma propriedadeSomeBaseClass
como vocêe se você usar como
O
obj
objeto não terápublicProperty
propriedades como neste exemplo .Seu segundo exemplo
Ele está executando a
constructor
função, criando uma instânciaSomeBaseClass
e herdando oSomeBaseClass
objeto inteiro . Então, se você usarNesse caso, sua
publicProperty
propriedade também está disponível para oobj
objeto, como neste exemplo .Como o
Object.create
não está disponível em alguns navegadores antigos, nesse caso, você pode usarO código acima apenas adiciona
Object.create
função se não estiver disponível para que você possa usar aObject.create
função e acho que o código acima descreve o queObject.create
realmente faz. Espero que ajude de alguma forma.fonte
SomeBaseClass
.Isso é verdade no seu caso.
Quando
SomeBaseClass
tem um corpo de função, isso seria executado com anew
palavra - chave Isso geralmente não se destina - você só deseja configurar a cadeia de protótipos. Em alguns casos, pode até causar problemas sérios porque você realmente instancia um objeto, cujas variáveis de escopo privado são compartilhadas por todas asMyClass
instâncias, pois herdam os mesmos métodos privilegiados. Outros efeitos colaterais são imagináveis.Então, você geralmente deve preferir
Object.create
. No entanto, ele não é suportado em alguns navegadores herdados; é por isso que você vê anew
abordagem com muita frequência, pois muitas vezes não causa danos (óbvios). Também dê uma olhada nesta resposta .fonte
A diferença se torna óbvia se você usar
Object.create()
como pretendido. Na verdade, oculta completamente aprototype
palavra do seu código, ele faz o trabalho sob o capô. UsandoObject.create()
, podemos ir comoE então podemos estender / herdar outros objetos disso
Portanto, esse é outro conceito, uma maneira mais "orientada a objetos" de herdar. Não há "função construtora" pronta
Object.create()
para uso, por exemplo. Mas é claro que você pode apenas criar e chamar uma função de construtor autodefinida dentro desses objetos.Um argumento para usar
Object.create()
é que ele pode olhar mais naturais para misturar / * herdar * de outros objetos, que usando Javascript maneira padrão .fonte
Object.create
realmente não pode substituir a abordagem clássica comnew
quando uma função de construtor é necessárioObject.create
não chama uma função que seria necessária para criar fechamentos. É claro queObject.create
você pode colocar uminit
método em seus objetos e chamá-lo imediatamente, e talvez até retornethis
para obter uma sintaxe concisa - mas espere, esse é um construtor.new
usa "ligação a objetos", então não há muita diferença. De fato, existem apenas duas coisas:.constructor
é chamada.init
e essa função não tem uma.prototype
propriedade apontando para o seu objeto protótipo. O resto é apenas sintaxe - e eu prefiro onew X
contrárioObject.create(x).init()
.Eu não sou especialista em java script, mas aqui está um exemplo simples para entender a diferença entre "Object.create" e "new" ..
etapa 1: crie a função pai com algumas propriedades e ações.
etapa 2: crie uma função filha (PersonSalary) que se estenda acima da função Pessoa usando Nova palavra-chave.
etapa 3: crie a segunda função filho (PersonLeaves) que se estende acima da função Person usando a palavra-chave Object.create .
// Agora verifique os protótipos das funções filho.
ambas as funções filho vincularão ao protótipo Pessoa (função pai) e poderão acessar seus métodos, mas se você criar uma função filho usando new, retornará um novo objeto com todas as propriedades pai de que não precisamos e também quando você criar qualquer objeto ou função usando "Novo" que a função pai é executada e que não queremos que seja.
Aqui estão os tópicos
fonte