如何处理.__ proto__!== process.constructor.prototype?

时间:2014-12-04 03:24:17

标签: javascript node.js prototype

我打开了node个repl并输入了

process.__proto__ === process.constructor.prototype

我很惊讶答案是

false
这让我很困惑。是不是o.__proto__被定义为它的构造函数原型?

1 个答案:

答案 0 :(得分:1)

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

如何构建process并不会立即从源代码中清除,因为它是一个宿主对象,但让我们追查它:

  1. 创建Environment时,creates a process object。这个C ++代码创建了一个等同于JS

    的V8 :: Object
    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 environmentSetupProcessObject is called,您从文档中了解过程对象sets up all the methods and properties

  2. 当节点loads the environment时,它将read and eval node.js文件来获取其中定义的功能。然后它将take the environment's process object and call the obtained function with it as an argument

  3. 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;