关于设置something.prototype .__ proto__的困惑

amb*_*tch 11 javascript node.js

在Node.js的Express模块​​的代码中,我遇到了这一行,为服务器设置了继承:

Server.prototype.__proto__ = connect.HTTPServer.prototype;
Run Code Online (Sandbox Code Playgroud)

我不知道这是什么一样-在MDC文档(https://developer.mozilla.org/en/JavaScript/Guide/Inheritance_Revisited#prototype_and_ )好像说我可能只是这样做:

Server.prototype = connect.HTTPServer.prototype;
Run Code Online (Sandbox Code Playgroud)

的确,我做了这个测试:

var parent = function(){}
parent.prototype = {
    test: function(){console.log('test')};
}

var child1 = function(){};
child1.prototype = parent.prototype;
var instance1 = new child1();
instance1.test();     // 'test'

var child2 = function(){};
child2.prototype.__proto__ = parent.prototype;
var instance2 = new child2();
instance2.test();     // 'test'
Run Code Online (Sandbox Code Playgroud)

看起来一样吗?所以,是的,我想知道设置object.prototype .__ proto是为了什么.谢谢!

vha*_*lac 10

看看上图这个页面(mckoss.com),显示prototype,constructor,__proto__一个小的层次结构关系.此外,图下方的代码也很好地描述了这种关系.

当你有一个功能Base,并设置中定义的函数对象的原型,该语句Derived.prototype = new Base;设置__proto__(实际上是内部[[prototype]])的Derived.prototype,以Base.prototype自动,使派生本身就是一个类,您可以从实例化对象.这似乎是一种更符合标准的定义派生类的方法.

从我读到的,__proto__是一种访问[[prototype]]对象内部的非标准方式.它似乎得到了很好的支持,但我不确定它是否应该被信任.

在任何情况下,您的示例Server.prototype.__proto__ = connect.HTTPServer.prototype;似乎以相反的方式进行派生:首先定义一个对象,Server通过定义构造函数和proto,然后[[prototype]]手动挂钩内部以将其变换为派生自的类HTTPServer.

至于你建议的替代方案,Server.prototype = connect.HTTPServer.prototype;:这是一个坏主意.在这里,您将原型设置为与原型Server相同的对象HTTPServer.因此,您对Server类所做的任何更改都将直接反映在其中HTTPServer,并且可以从其他派生类中访问HTTPServer.如果派生的两个类HTTPServer尝试定义相同的成员,则可以对混沌进行成像.