混淆设置something.prototype .__ proto__

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

Server.prototype.__proto__ = connect.HTTPServer.prototype; 

我不确定这是什么 – MDC文档(https://developer.mozilla.org/en/JavaScript/Guide/Inheritance_Revisited#prototype_and_proto)似乎说我可以这样做:

 Server.prototype = connect.HTTPServer.prototype; 

的确,我做了这个testing:

 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' 

看起来是一样的? 所以呀,我想知道什么设置object.prototype .__原型是。 谢谢!

看看这个页面上的图表(mckoss.com),它显示了一个小层次的prototypeconstructor ,__proto__关系。 图下方的代码也很好的描述了这个关系。

当你有一个函数Base ,并设置定义的函数对象的原型时,语句Derived.prototype = new Base;Derived.prototypeBase.prototype (实际上是internal [[prototype]]自动Derived.prototypeBase.prototype ,从而派生自己一个类,您可以从中实例化对象。 这似乎是定义派生类的更符合标准的方法。

从我读到的, __proto__是访问一个对象的内部[[prototype]]的非标准方式。 这似乎得到了很好的支持,但是我不确定是否值得信任。

在任何情况下,你的例子Server.prototype.__proto__ = connect.HTTPServer.prototype; 似乎以相反的方式进行派生:首先定义一个对象,通过定义构造函数和原型来定义Server ,然后手动连接内部[[prototype]]以将其变形为派生自HTTPServer的类。

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

非标准属性__proto__可以让你设置现有对象的原型。

在你的例子中,两个版本都会达到相同的效果,但是有一个区别:

child1的原型与parent的原型相同,而child2的原型是一个空对象,这个空对象的原型与parent的原型相同。

当然,由于child2及其原型没有方法test ,这个方法将在原型链中进一步查询。

也考虑到这一点:

您只想创build一个应该从另一个对象inheritance的对象。 现在,您可以编写一个构造函数,但是JavaScript具有对象文字符号来直接创build对象,并且您想要使用它。

如果你有一个构造函数,让新对象从另一个对象inheritance是一样简单的构造函数的prototype设置为该对象。

显然,这不适用于对象文字。 但在Firefox中,您可以使用__proto__来设置它:

 var server = { __proto__: connect.HTTPServer.prototype, other: properties }; 

由于这个属性不是标准的,你应该避免使用它。