wee*_*ens 7 javascript node.js ecmascript-6
在Node.js 4.2.1上运行以下代码时:
'use strict';
var util = require('util');
class MyClass {
constructor(name) {
this.name = name;
}
}
function MyDerived() {
MyClass.call(this, 'MyDerived');
}
util.inherits(MyDerived, MyClass);
var d = new MyDerived();Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
constructor(name) {
^
TypeError: Class constructors cannot be invoked without 'new'
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以从ECMAScript 6类继承旧式JavaScript"类"?并且,如果可能的话,那怎么样?
一旦你选择了class语法,就没有出路了.
问题是ES6中的继承是通过this使用返回值来初始化关键字来完成的super(),这是一个类似于的构造函数调用new..call()在当前"未初始化"的子实例上"应用"()"父"构造函数的旧习惯用法不再有效.
你仍然可以做的是诉诸"寄生继承" - 你必须显式构造实例,扩展它,return它:
function MyDerived() {
var derived = new MyClass('MyDerived');
… // set up properties
return derived;
}
Run Code Online (Sandbox Code Playgroud)
当您执行此操作时new MyClass,您将无法正确设置原型.为此,您需要使用新的ES6 Reflect.construct函数,该函数将子类作为可选的第三个参数:
function MyDerived() {
var derived = Reflect.construct(MyClass, ['MyDerived'], new.target||MyDerived);
… // set up properties
return derived;
}
Run Code Online (Sandbox Code Playgroud)
这具有额外的好处,MyDerived不需要再调用new(只要你MyDerived在new.target空时提供).
| 归档时间: |
|
| 查看次数: |
499 次 |
| 最近记录: |