Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
继承的Javascript设计方法_Javascript_Inheritance_Underscore.js - Fatal编程技术网

继承的Javascript设计方法

继承的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"; },

我正在使用一个JavaScript应用程序,它使用下划线.js来处理大量继承。对象定义的标准模式是在变量中定义基本对象,然后直接定义其原型,如下所示:

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中是个笨蛋,因为我一直在努力让事情顺利进行。现在编辑这个问题……谢谢,这是一个非常有用的答案,寄生继承是最重要的我需要了解更多关于这个过程的信息。