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
- 在所有Node应用程序上扩展Object.prototype.myNewMethod
- 如何在node.js中使用原型
- Array.prototype.each = function(callback){for(var i = 0; i <this.length; i ++)callback(this ); } – 这个可以吗?
- 对象在使用原型时没有方法
- 如何在mongoose中扩展查询对象
- 如何使用Uglify.jsparsing和迭代原型方法?
- Javascriptinheritance使用节点
- JavaScript中的JavaScript原型对象效率
- 在Javascript中,为什么Object.getPrototypeOf()返回一个空列表?