Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.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_Node.js_Inheritance - Fatal编程技术网

这是在Javascript中进行继承的好方法吗?

这是在Javascript中进行继承的好方法吗?,javascript,node.js,inheritance,Javascript,Node.js,Inheritance,可能重复: 我正在研究Mongoose(多么漂亮的一款软件…),我看到了: function Model (doc, fields, skipId) { Document.call(this, doc, fields, skipId); }; /*! * Inherits from Document. */ Model.prototype.__proto__ = Document.prototype; 哇,这是我见过的最简单的设置继承的方法。我知道这不能用浏览器完成,但服务器端。。

可能重复:

我正在研究Mongoose(多么漂亮的一款软件…),我看到了:

function Model (doc, fields, skipId) {
  Document.call(this, doc, fields, skipId);
};

/*!
 * Inherits from Document.
 */
Model.prototype.__proto__ = Document.prototype;
哇,这是我见过的最简单的设置继承的方法。我知道这不能用浏览器完成,但服务器端。。。它看起来像一个赢家:

  • 派生类调用父类的构造函数
  • 派生类的prototype对象被设置为proto指向父类的prototype
就这样


这可能是在服务器端实现继承的最干净、最简单的方法吗?我这样问是因为我喜欢它,我想知道我是否遗漏了一些限制/问题…?

据我所知,这可以在客户端完成,就像:

Model.prototype = new Document();
Model.prototype.constructor = Model;

好吧,一些浏览器的franeworks曾经通过使用
A.prototype=new B()
来模拟这一点,但这有点不太妥当:)这两种方法的一个重要好处是,猴子修补父类使子代能够使用父类的新的/更改的方法(与
A.prototype=$.extend({},B.prototype)不同)
和类似的黑客攻击)


至于所描述的方法,它显然看起来更干净,所以我会投票赞成“是”

它需要更多的时间才能真正使它像问题中的代码:
Model.prototype=Object.create(Document.prototype,{constructor:{value:Model,configurable:true,writeable:true})不太干净。我使用相同的。如果我们忘记了第二行,那么实例化模型类时的构造函数调用就是父类(在本例中是文档构造函数)。我经常使用这个网站作为参考@user1689607哇好一个。。。我不熟悉Object.create!使用构造函数:。。。参数,是否也包含代码
Document.call行(this,doc,fields,skipId)
.?@Merc:不,仍然需要对每个实例调用
文档
构造函数,就像您当前所做的那样。@user1689607该构造函数是什么:。。。对于任何实际用途?除了依赖非标准属性之外,我看不出任何问题。比
Model.prototype=newdocument()更简单
A.prototype=new B()
不黑。这是在javascript中执行继承的标准方法。所有其他方法都是黑客。@Anton:你说得对,仅仅为了设置继承而调用构造函数不是一个好方法。要绕过它,您可以使用
Object.create
<代码>A.prototype=Object.create(B.prototype)+1用户一六八九,随便:)@slebetman:除了使用
new B()
调用构造函数之外。Anton的观点是,调用构造函数来设置继承可能会产生一些不希望的副作用。
Bobj
技巧不会真正起作用,因为
A
C
将使用同一个对象,因此它们将看到彼此的扩展。@slebetman不仅可以
B
的构造函数产生副作用,甚至可能需要一些参数。例如,
Human=function(dateOfBirth){if(TypeOfDateOfBirth=='undefined')抛出'Missing argument';…}。现在尝试从
人类继承
。。。