Node.js中与版本相关的typesinheritance
为什么下面的代码只能在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
。
看看两个不同版本的代码,我发现它们之间的唯一区别就是原型inheritance的实现方式。
4.x版
ctor.prototype = Object.create(superCtor.prototype,{ 构造函数:{ 价值:ctor, enumerable:false, 可写:真, 可configuration:true } });
其中ctor
是子构造函数, superCtor
是父构造函数。
主
Object.setPrototypeOf(ctor.prototype,superCtor.prototype);
其中ctor
是子构造函数, superCtor
是父构造函数。
对于版本4.x(可能低于),父级的原型被分配给孩子的原型,因此, 完全取代它 。
然而,最新版本使用Object.setPrototypeOf
, 我假设它不会取代孩子的原型,但保留孩子的原型以及父母的原型。
更新:我发现这在ECMAScript 2017规范,如果它有任何帮助…
在Node 5.0之前, util.inherits
使用Object.create()
来创buildinheritance链。 这不幸有一个错误。 您在使用Child.prototype
之前附加到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());