我打开了node
个repl并输入了
process.__proto__ === process.constructor.prototype
我很惊讶答案是
false
这让我很困惑。是不是o.__proto__
被定义为它的构造函数原型?
答案 0 :(得分:1)
TL; DR:因为它已被篡改。
如何构建process
并不会立即从源代码中清除,因为它是一个宿主对象,但让我们追查它:
创建Environment
时,creates a process
object。这个C ++代码创建了一个等同于JS
var process = new function process() { };
是的,我们should not do that。但无论如何,这就是它的完成方式,这个功能就是你记录process.constructor
时得到的:function process() { [native code] }
。哦,Object.getPrototypeOf(new process.constructor) == process.constructor.prototype
按预期保持。
然后,它在环境中places the object in the environment和SetupProcessObject
is called,您从文档中了解过程对象sets up all the methods and properties。
当节点loads the environment时,它将read and eval node.js
文件来获取其中定义的功能。然后它将take the environment's process object and call the obtained function with it as an argument。
function defined in node.js
现在进行了大量的自举,例如将全局global
变量设置为全局对象。它还calls startup
function,其定义如下:
var EventEmitter = NativeModule.require('events').EventEmitter;
process.__proto__ = Object.create(EventEmitter.prototype, {
constructor: {
value: process.constructor
}
});
EventEmitter.call(process);
…
你有它。此代码段使用继承自__proto__
的新原型对象替换process
EventEmitter.prototype
,但保留constructor
属性的原始值。 process
不再继承process.constructor.prototype
,它指向" old"原型对象。
我无法解释他们为什么这样做:-)也许更好的方法就是单纯做
process.__proto__.__proto__ = EventEmitter.prototype;