JavaScript中的原型继承
我一直在看Douglas Crockford在YUI剧院的演讲,我有一个关于JavaScript继承的问题 道格拉斯举了这个例子来说明“Hoozit”继承自“Gizmo”: 为什么他写的是JavaScript中的原型继承,javascript,inheritance,prototypal-inheritance,Javascript,Inheritance,Prototypal Inheritance,我一直在看Douglas Crockford在YUI剧院的演讲,我有一个关于JavaScript继承的问题 道格拉斯举了这个例子来说明“Hoozit”继承自“Gizmo”: 为什么他写的是Hoozit.prototype=newgizmo(),而不是Hoozit.prototype=Gizmo.prototype 这两者之间有什么区别吗?原因是使用Hoozit.prototype=Gizmo.prototype意味着修改Hoozit的prototype对象也会修改Gizmo类型的对象,这不是预期
Hoozit.prototype=newgizmo()
,而不是Hoozit.prototype=Gizmo.prototype
这两者之间有什么区别吗?原因是使用
Hoozit.prototype=Gizmo.prototype
意味着修改Hoozit的prototype对象也会修改Gizmo类型的对象,这不是预期的行为
Hoozit.prototype=new Gizmo()
继承自Gizmo,如果他写Hoozit.prototype=Gizmo.prototype,他以后对Hoozit原型所做的任何修改都将反映在Gizmo原型中。除了Triptych的回答之外:Hoozit实例还将继承Gizmo的所有实例属性,而不仅仅是原型中定义的那些属性;例如:
function Gizmo() {
this.foo = 'bar'; // foo is visible in every Hoozit instance
}
其他答案解决了这个问题,但如果您确实想继承原型,可以使用一些寄生魔法:
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;
};
现在,您可以替换:
Hoozit.prototype = new Gizmo();
与
除非你有一个真正的大Gizmo构造函数(我的建议中唯一的胜利是你不必调用Gizmo的构造函数来连接原型),否则你可能不值得这么麻烦。在.中我有许多这类模式的示例,但是如果您不想调用构造函数,可以使用一些间接(寄生继承)。
Hoozit.prototype = new Gizmo();
inheritPrototype(Hoozit, Gizmo);