混淆设置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),它显示了一个小层次的prototype
, constructor
,__proto__关系。 图下方的代码也很好的描述了这个关系。
当你有一个函数Base
,并设置定义的函数对象的原型时,语句Derived.prototype = new Base;
将Derived.prototype
的Base.prototype
(实际上是internal [[prototype]]
自动Derived.prototype
为Base.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 };
由于这个属性不是标准的,你应该避免使用它。