Pergunta

Eu vejo um monte de código como este:

function Base() {}
function Sub() {}
Sub.prototype = new Base();

No entanto, se você fizer isso:

s = new Sub();
print(s.constructor == Sub);

Esta é falsa. Este parece confuso para mim, uma vez que o construtor de s é, de fato, Sub. É convencional / melhor de fazer isso?

function Base() {}
function Sub() {}
Sub.prototype = new Base();
Sub.prototype.constructor = Sub;

ou ele realmente não importa?

Foi útil?

Solução

'construtor' não faz o que parece que ele faz. Este, além de sua não-standardness, é uma boa razão para evitar usá-lo -. Vara com instanceof e protótipo

Tecnicamente: 'construtor' não é uma propriedade da instância 's', é uma propriedade do 'Sub' objeto de protótipo que mostra completamente. Ao criar a função 'Sub' em Mozilla, você obter um objeto Sub.prototype padrão recém-cunhadas, que tem um 'construtor' apontando para a função Sub como cortesia.

No entanto, você, em seguida, substituir o protótipo com uma nova Base (). O protótipo padrão original com o link para o Sub é perdida; em vez disso, Sub.prototype é uma instância de base sem qualquer propriedade 'Construtor' substituir. Assim:

new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base

... todo o caminho para o objeto mais básico cujo protótipo não se alterou.

É convencional / melhor de fazer isso?

Quando se lida com objetos JavaScript classes / não há uma convenção; sistema metaclass de cada biblioteca se comporta de forma ligeiramente diferente. Eu não vi um que escreve 'construtor' para cada classe derivada manualmente, mas parece tão bom uma solução como qualquer se você realmente quer ter o construtor real disponível; que também irá tornar o código compatível com os navegadores / motores que não dão a você 'construtor'.

Eu considerar dar-lhe um nome diferente, porém, a confusão evitar com a propriedade 'Construtor' existente e diferentemente-se comportando.

Outras dicas

Se você quiser testar se um objeto é exatamente uma instância de Sub usar o operador instanceof: -

print(s instanceof Sub);

Se você quiser saber se um objeto é uma instância de Sub ou uma instância de uma sub-classe de Sub usar o método isPrototypeOf: -

print(Sub.prototype.isPrototypeOf(s));

Sim,

Sub.prototype.constructor = Sub;

Vamos usar instanceof mas há uma solução melhor. Olhe aqui:, TDD JS Inheritance no GitHub , e encontrar o Parasitárias Combinação Herança padrão. O código é TDD'd assim que você deve ser capaz de Grokar-lo muito rapidamente e depois simplesmente mudar os nomes para você começar. Este é basicamente o que os usos YAHOO.lang.extend (fonte: empregado yahoo e autor de Nicholas Zákas Professional JavaScript para Web Developer, 2ª ed, página 181). Bom livro pelo caminho (não afiliado de qualquer maneira!)

Por quê? Porque o padrão clássico que você está trabalhando com tem referência staticy vars (se você criar var arr = [1,2] no objeto de base, todas as instâncias terão de leitura / gravação e "estado share" de 'arr'! Se você uso construtor roubar você pode obter em torno deste. Ver meus exemplos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top