Pergunta

Eu estive assistindo palestras de Douglas Crockford no YUI Theater, e eu tenho uma pergunta sobre a herança JavaScript ...

Douglas dá este exemplo para mostrar que herda "Hoozit" de "Gizmo":

function Hoozit(id) {
    this.id = id;
}
Hoozit.prototype = new Gizmo();
Hoozit.prototype.test = function (id) {
    return this.id === id;
};

Por que ele escrever Hoozit.prototype = new Gizmo() vez de Hoozit.prototype = Gizmo.prototype?

Existe alguma diferença entre esses dois?

Foi útil?

Solução

A razão é que o uso de Hoozit.prototype = Gizmo.prototype significaria que modificar objeto de protótipo de Hoozit também modificar objetos do tipo Gizmo, o que não é o comportamento esperado.

herda Hoozit.prototype = new Gizmo() de Gizmo, e depois sai Gizmo sozinho.

Outras dicas

As outras respostas resolver isso, mas se você deseja herdar o protótipo, você pode usar um pouco de magia parasita:

Object.prototype.inherit = function(p) {
    NewObj = function(){};
    NewObj.prototype = p;
    return new NewObj(); 
};

// Paraphrasing of Nicholas Zakas's Prototype Inheritance helper
function inheritPrototype(subType, superType) {
    var prototype = Object.inherit(superType.prototype);
    prototype.constructor = subType;
    subType.prototype = prototype;
};

Agora você pode substituir o:

Hoozit.prototype = new Gizmo();

com

inheritPrototype(Hoozit, Gizmo);

Pode não valer a pena a menos que tenha um verdadeiro grande construtor Gizmo (a única vitória na minha sugestão é que você não tem que chamar o construtor do Gizmo para ligar o protótipo). Eu tenho exemplos de muitos destes tipos de padrões em TDD JavaScript Exemplos .

Se ele escreve Hoozit.prototype = Gizmo.prototype qualquer modfication ele faz mais tarde para o protótipo de Hoozit será refletido no protótipo de Gizmo.

Além de resposta de Tríptico: casos Hoozit também herdará todas as propriedades de instância de Gizmo, não só as definidas no protótipo; por exemplo:

function Gizmo() {
    this.foo = 'bar'; // foo is visible in every Hoozit instance
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top