Object.create(BaseObject)和util的区别是什么?继承(MyObject BaseObject)
What is the difference between Object.create(BaseObject) and util.inherits(MyObject, BaseObject)?
这两种解决方案设置原型的区别是什么?
MyObject.prototype = Object.create(EventEmitter.prototype);
MyObject.prototype = util.inherits(MyObject, EventEmitter);
是的,我在很多项目中看到他们设置(恢复)原型构造函数为实际对象构造函数,像这样:
MyObject.prototype = Object.create(EventEmitter.prototype);
MyObject.prototype.constructor = MyObject;
"恢复"构造函数的原因是什么?我使用引号是因为这个动作对我来说更像是重写,因为MyObject.prototype
是EventEmitter
,那么原型的构造函数应该是EventEmitter
的构造函数。恢复原型构造函数的优势是什么?这解决了什么现实生活中的问题?
其次,在super_属性中拥有基类构造函数的优势是什么?
util.inherits
在内部使用Object.create
从超类中分配prototype。如果你看一下inherits方法的源代码,你会注意到它除了分配prototype之外几乎没有做其他的事情:
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中实现经典的OO继承。如果没有它,您将创建一个子类,其构造函数将指向它的父类。如果你正在创建一个模块,如果有人试图访问你的类的构造函数,他们会错误地访问parentClass constructor:
MyObject.prototype = Object.create(EventEmitter.prototype); MyObject.prototype.constructor === MyObject ; //false (new MyObject).constructor === MyObject; //false
为了方便,通过
super_
属性保存对superConstructor的引用:MyStream.super_ === EventEmitter; //true
由于前面提到的超级构造函数已经被替换了,如果你需要访问超级构造函数,你可以使用这个属性。例如,您可以看到
fs.ReadStream
的继承链:var ReadStream = require('fs').ReadStream; ReadStream.super_.super_.super_ // ReadStream<-Readable<-Stream<-EventEmitter
相关文章:
- 这是什么 ==- javascript 运算符
- 我的单元测试选项是什么
- 打破承诺链的好方法是什么
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Javascript中的空白是什么
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 在ng重复循环中显示条件内容的最佳方式是什么
- 我的客户端选项是什么
- 这是什么“;要求“;事情
- 未捕获的类型错误:topFrame.window.changeSelectedBarStyle不是函数,原因是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- @@(“at at”)在ES6 JavaScript中是什么意思
- knex:根据结果创建数组的合适方法是什么
- JSDoc:模块和名称空间之间的关系是什么
- minimy javascript是什么意思?Backbone.js