怎么过程.__ proto__!== process.constructor.prototype?

我打开了node repl并input

 process.__proto__ === process.constructor.prototype 

我很惊讶,答案是

 false 

这让我很困惑。 那不是o.__proto__被定义为它的构造器原型吗?

TL; DR:因为它被篡改了。

因为它是一个主机对象,所以如何构buildprocess并不是立即从源代码中清除,而是让我们追踪它:

  1. 当创build一个Environment ,它创build一个process对象 。 这个C ++代码创build了一个相当于JS的V8 :: Object

     var process = new function process() { }; 

    是的,我们不应该这样做 。 但无论如何,这是如何完成的,而且这个函数是你在loggingprocess.constructor时得到的: function process() { [native code] } 哦, Object.getPrototypeOf(new process.constructor) == process.constructor.prototype按预期保持。

    然后, 将对象放置在环境中,并在环境 中调用 SetupProcessObject ,从而在文档中设置所了解的过程对象上的所有方法和属性 。

  2. 当Node 加载环境时 ,它将读取并评估 node.js文件以获取在其中定义的函数。 然后它将采取环境的过程对象,并将其作为参数调用所获得的函数 。

  3. 现在, 在node.js定义的这个函数会执行大量的引导,例如将全局globalvariables设置为全局对象。 它也调用 startupfunction ,定义如下:

     var EventEmitter = NativeModule.require('events').EventEmitter; process.__proto__ = Object.create(EventEmitter.prototype, { constructor: { value: process.constructor } }); EventEmitter.call(process); … 

    你有它。 这段代码用一个从EventEmitter.prototypeinheritance的新原型对象replace了__proto__ process ,但保留了constructor属性的原始值。 process不再从process.constructor.prototypeinheritance,它指向“旧”原型对象。

    我无法解释为什么他们这样做:-)也许更好的方法是简单的做

     process.__proto__.__proto__ = EventEmitter.prototype;