Object.create(BaseObject)和util.inherits(MyObject,BaseObject)有什么区别?

这两个解决scheme设置原型有什么区别?

MyObject.prototype = Object.create(EventEmitter.prototype); MyObject.prototype = util.inherits(MyObject, EventEmitter); 

UPDATE

是啊,我看到它在多个项目中,他们将原型构造函数设置(恢复)到实际的对象构造函数,如下所示:

 MyObject.prototype = Object.create(EventEmitter.prototype); MyObject.prototype.constructor = MyObject; 

“恢复”构造函数背后的原因是什么? 我使用引号,因为这个动作看起来更像是一个覆盖,因为MyObject.prototypeEventEmitter那么原型的构造函数应该是EventEmitter的构造EventEmitter 。 恢复原型构造函数的优点是什么? 这真正的生活问题解决了什么?

其次是超级属性中的基础构造函数的优点是什么?

util.inherits内部使用Object.create从超类分配原型。 如果你看看inheritance方法的来源 ,你会注意到除了分配原型之外,它还没有其他的东西:

 exports.inherits = function(ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; 
  1. 恢复原型对象的constructor引用。 以便

    MyObject.prototype.constructor === MyObject //true

    这是为了在javascript中实现经典的OOinheritance。 没有它,你会创build一个子类,其构造函数将指向它的父类。 如果你正在创build一个模块,并且如果有人试图访问你的类的构造函数,他们会错误地访问parentClass的构造函数:

     MyObject.prototype = Object.create(EventEmitter.prototype); MyObject.prototype.constructor === MyObject ; //false (new MyObject).constructor === MyObject; //false 
  2. 为方便起见,通过super_属性保存对superConstructor的引用:

    MyStream.super_ === EventEmitter; //true

    由于超级构造函数已经被replace,如前所述,如果你需要访问超级构造函数,你可以通过使用这个属性来完成。 例如,你可以看到fs.ReadStreaminheritance链:

     var ReadStream = require('fs').ReadStream; ReadStream.super_.super_.super_ // ReadStream<-Readable<-Stream<-EventEmitter