JavaScript中的原型继承

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类型的对象,这不是预期

我一直在看Douglas Crockford在YUI剧院的演讲,我有一个关于JavaScript继承的问题

道格拉斯举了这个例子来说明“Hoozit”继承自“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);