为什么util.inherits创建一个继承自超级构造函数原型的新对象?

时间:2015-06-06 22:58:28

标签: javascript node.js inheritance prototype

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?

1 个答案:

答案 0 :(得分:3)

  

为什么不这样做:ctor.prototype = superCtr.prototype?

这意味着每当有人向ctor.prototype添加方法时,他们最终都会向superCtr.prototype添加方法,因为它们是同一个对象。

那太可怕了!这意味着如果你有例如http.IncomingMessage继承自EventEmitterhttp.IncomingMessage.prototype上的每个方法都会以EventEmitter.prototype结尾。因此,所有io.js中的每个事件发射器都会有与HTTP相关的方法!

相反,我们创建了一个新对象,我们可以添加特定于ctor实例的方法。由于我们确保来自Object.create的新对象为superCtor.prototype d,因此我们知道针对该对象的任何查找都将遵循[[Prototype]] - 链并从superCtor.prototype中查找方法,因为在做继承时你会期待。但它是一个新的对象,有自己定制的空间,正如你所希望的那样。