Node.js中依赖于版本的类型继承
Version-dependent type inheritance in Node.js
为什么下面的代码只在Node.js 5.x和6.x下工作,而在4.x和更早的版本中中断?
有没有一种方法可以修改它,使其在任何Node.js 0.10.x-6.x中工作?
'use strict';
var util = require('util');
function Parent() {
}
Parent.prototype.show = function () {
return this.msg(); // virtual-like call;
};
function Child() {
}
Child.prototype.msg = function () {
return 'Hello!';
};
util.inherits(Child, Parent);
var test = new Child();
console.log(test.show());
在Node.js 5.x和6.x中,它显示Hello!
。在Node.js的任何早期版本中,它都显示TypeError: this.msg is not a function
。
在Node 5.0之前,util.inherits
使用Object.create()
创建继承链。不幸的是,这有一个错误。在使用util.inherits
之前附加到Child.prototype
的任何内容都被删除了——这就是导致错误的原因。从5.0及更高版本开始,Node在后台使用Object.setPrototypeOf
。
幸运的是,修复非常简单。在将方法添加到Child.prototype
之前移动util.inherits
调用。
以下代码将在0.10到6.0之间工作。
'use strict';
var util = require('util');
function Parent() {
}
Parent.prototype.show = function () {
return this.msg(); // virtual-like call;
};
function Child() {
}
util.inherits(Child, Parent);
Child.prototype.msg = function () {
return 'Hello!';
};
var test = new Child();
console.log(test.show());
通过查看两个不同版本的代码,我发现它们之间唯一的区别是实现原型继承的方式。
4.x
ctor.prototype=对象.create(superCtor.prototype{构造函数:{值:ctor,可枚举:false,可写:true,可配置:true}});
其中ctor
是子构造函数,superCtor
是父构造函数。
主
Object.setPrototypeOf(ctor.prototype,superCtor.prototype);
其中ctor
是子构造函数,superCtor
是父构造函数。
对于4.x版本(以及可能更低的版本),父的原型被分配给子的原型,因此完全取代了它。
然而,最新版本使用了Object.setPrototypeOf
,我假设它不会取代孩子的原型,而是保留了孩子的原型和父母的原型。
更新:我在ECMAScript 2017规范中发现了这一点,如果它有任何帮助的话。。。
相关文章:
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 如何在DOM元素上按类型构建此函数
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 如何从querySelectorAll中获取按钮类型
- 如何在输入字段中的按钮的帮助下打开日历,该字段的类型为“=”;日期”;
- 如何将具有文本类型值的var放入jQuery函数中
- javascript解释器如何理解变量的数据类型
- 可变大小的JavaScript字符串如何成为基元类型
- AngularJS指令只识别双向绑定类型
- Node.js中依赖于版本的类型继承
- JavaScript中的原型继承是否演示了类型多态性
- 继承和 TypeScript 错误:X 不是构造函数类型
- 类链中的继承类型
- 复杂的循环节点模块依赖抛出“类型错误:'继承'的超级构造函数必须有一个原型”
- 这两种类型的继承有什么区别?
- Javascript继承:子类型原型不能访问超类型的属性/函数
- 在Javascript原型继承中,数组和数字数据类型之间有区别吗
- 如何使用JSON创建从对象类型继承的对象