herança prototípica em JavaScript
-
23-08-2019 - |
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?
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
}