怎么过程.__ proto__!== process.constructor.prototype?
我打开了node
repl并input
process.__proto__ === process.constructor.prototype
我很惊讶,答案是
false
这让我很困惑。 那不是o.__proto__
被定义为它的构造器原型吗?
TL; DR:因为它被篡改了。
因为它是一个主机对象,所以如何构buildprocess
并不是立即从源代码中清除,而是让我们追踪它:
-
当创build一个
Environment
,它创build一个process
对象 。 这个C ++代码创build了一个相当于JS的V8 :: Objectvar process = new function process() { };
是的,我们不应该这样做 。 但无论如何,这是如何完成的,而且这个函数是你在logging
process.constructor
时得到的:function process() { [native code] }
。 哦,Object.getPrototypeOf(new process.constructor) == process.constructor.prototype
按预期保持。然后, 将对象放置在环境中,并在环境 中调用
SetupProcessObject
,从而在文档中设置所了解的过程对象上的所有方法和属性 。 -
当Node 加载环境时 ,它将读取并评估
node.js
文件以获取在其中定义的函数。 然后它将采取环境的过程对象,并将其作为参数调用所获得的函数 。 -
现在, 在
node.js
定义的这个函数会执行大量的引导,例如将全局global
variables设置为全局对象。 它也调用startup
function ,定义如下:var EventEmitter = NativeModule.require('events').EventEmitter; process.__proto__ = Object.create(EventEmitter.prototype, { constructor: { value: process.constructor } }); EventEmitter.call(process); …
你有它。 这段代码用一个从
EventEmitter.prototype
inheritance的新原型对象replace了__proto__
process
,但保留了constructor
属性的原始值。process
不再从process.constructor.prototype
inheritance,它指向“旧”原型对象。我无法解释为什么他们这样做:-)也许更好的方法是简单的做
process.__proto__.__proto__ = EventEmitter.prototype;