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());