继承的Javascript设计方法
我正在使用一个JavaScript应用程序,它使用下划线.js来处理大量继承。对象定义的标准模式是在变量中定义基本对象,然后直接定义其原型,如下所示:继承的Javascript设计方法,javascript,inheritance,underscore.js,Javascript,Inheritance,Underscore.js,我正在使用一个JavaScript应用程序,它使用下划线.js来处理大量继承。对象定义的标准模式是在变量中定义基本对象,然后直接定义其原型,如下所示: var Parent = function() { this.name="parent"; this.loadData(); }; Parent.prototype = { loadData: function() { this.say="parent loadData"; },
var Parent = function()
{
this.name="parent";
this.loadData();
};
Parent.prototype = {
loadData: function()
{
this.say="parent loadData";
},
action: function()
{
return this.name+" says: '"+this.say+"'";
}
};
var Child = function()
{
this.name="child";
_.extend(this, new Parent());
};
Child.prototype= {
loadData: function()
{
this.say="child data loaded";
}
});
这很好用,而且相当容易阅读,但我对系统中处理继承的方式有点困惑。作者使用了\ extend
方法以相同的格式创建子对象,如下所示:
var Parent = function()
{
this.name="parent";
this.loadData();
};
Parent.prototype = {
loadData: function()
{
this.say="parent loadData";
},
action: function()
{
return this.name+" says: '"+this.say+"'";
}
};
var Child = function()
{
this.name="child";
_.extend(this, new Parent());
};
Child.prototype= {
loadData: function()
{
this.say="child data loaded";
}
});
问题是,尽管核心属性似乎可以复制,但我似乎拥有父方法而不是子方法
var myParent = new Parent();
var myChild = new Child();
console.log( myParent.action() ); // "parent says: 'parent loadData'"
console.log( myChild.action() ); // "child says: 'parent loadData'"
我尝试了一个扩展(Child.prototype,{…etc
),但似乎没有帮助。现在我可以回到过去处理继承属性的方式Child.prototype.loadData=function()
但它会打破应用程序其余部分使用的习惯用法,因此我想知道:这是JavaScript面向对象的标准方法吗?如果是,它是否有名称/任何地方的文档?是否有方法在保留可读代码的同时保持此模型和实际继承正常工作
呃!检查一下它的作用:它创建了一个新的父对象
实例,并将名称
属性(可能还有一些继承的属性)复制到该实例中。然后,它会丢弃该对象。为什么?我不知道
有一种称为寄生继承的模式,其工作原理有点像mixin,它至少返回修改后的对象,使其成为“子实例”。但就目前而言,这是完全无用的
什么是可以接受的
_.extend(this, new Parent());
将复制实际子实例上的属性。但有一个更简单的解决方案-只需立即在新实例上创建它们:
Parent.call(this);
我尝试了一个
\扩展(Child.prototype,{…
),但似乎没有帮助
嗯,这是朝着正确的方向迈出的一步。除了上面的“超级”调用之外,您还希望在孩子的原型上拥有父对象的共享(原型)属性。您可以这样做
_.extend(Child.prototype, Parent.prototype, {
loadData: …
});
要将它们(以及新的、特定于子对象的属性)复制到prototype对象上,关键是创建一个(动态、原型)继承自父对象的对象。prototype:
Child.prototype = _.extend(Object.create(Parent.prototype), {
loadData: …
});
\扩展(新父项(),此)
完全是垃圾。因此:不,这不是一种标准方法。@Bergi很高兴知道。为什么它完全是垃圾?显然,这是一个非常简单的说明-这里的大多数函数都相当复杂,并且至少确保了属性级继承。我不太明白的是,为什么原始设计人员会使用osen使用这种方法,但它们似乎总体上是有能力的,所以如果问题出在我的理解上,我不想到处破坏习惯用法。因为它不起作用。要继承,您可以使用parent.call继承parent的实例specefic成员(这是参数)
要设置继承的原型部分,可以执行Child.prototype=Object.create(Parent.prototype)
@glenatron:看到我的答案了吗?你能给我一个链接看看你在哪里见过这种模式吗?设计师们似乎不是很称职。啊……嗯……这个最重要的部分可能是我在JSFIDLE中是个笨蛋,因为我一直在努力让事情顺利进行。现在编辑这个问题……谢谢,这是一个非常有用的答案,寄生继承是最重要的我需要了解更多关于这个过程的信息。