在the source util.inherits
中,他们调用object.create
来创建一个新对象,其原型是超级构造函数的原型。
ctor.prototype = Object.create(superCtor.prototype, {
constructor: {
value: ctor,
enumerable: false,
writable: true,
configurable: true
}
});
这是为什么?为什么不这样做:
ctor.prototype = superCtr.prototype?
答案 0 :(得分:3)
为什么不这样做:ctor.prototype = superCtr.prototype?
这意味着每当有人向ctor.prototype
添加方法时,他们最终都会向superCtr.prototype
添加方法,因为它们是同一个对象。
那太可怕了!这意味着如果你有例如http.IncomingMessage
继承自EventEmitter
,http.IncomingMessage.prototype
上的每个方法都会以EventEmitter.prototype
结尾。因此,所有io.js中的每个事件发射器都会有与HTTP相关的方法!
相反,我们创建了一个新对象,我们可以添加特定于ctor
实例的方法。由于我们确保来自Object.create
的新对象为superCtor.prototype
d,因此我们知道针对该对象的任何查找都将遵循[[Prototype]] - 链并从superCtor.prototype
中查找方法,因为在做继承时你会期待。但它是一个新的对象,有自己定制的空间,正如你所希望的那样。