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.prototype
是EventEmitter
那么原型的构造函数应该是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 } }); };
-
恢复原型对象的
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
-
为方便起见,通过
super_
属性保存对superConstructor的引用:MyStream.super_ === EventEmitter; //true
由于超级构造函数已经被replace,如前所述,如果你需要访问超级构造函数,你可以通过使用这个属性来完成。 例如,你可以看到
fs.ReadStream
inheritance链:var ReadStream = require('fs').ReadStream; ReadStream.super_.super_.super_ // ReadStream<-Readable<-Stream<-EventEmitter