如何使用 Dojo 扩展 es6 class
how to extends es6 class using Dojo
我有一些 es6 class
class Human {
constructor(){
this.age = 0;
}
}
我想继承这个 class 使用 dojo 工具包
define(["dojo/_base/declare"],
function (declare) {
return declare("Man", Human, {
});
});
我收到错误 Class constructor Human cannot be invoked without 'new'
。
试图从 Human.constructor
和 Human.funcWrapper
继承
class Human {
constructor(){
this.age = 0;
}
static funcWrapper(){
return new Human()
}
}
没有任何效果。
我知道我可以使用 babel 将我的代码转换为函数,但由于某些政治原因我不想要。
像往常一样,我发帖苦苦思索了几个小时,然后我提出了一个解决方案。到目前为止,我已经对其进行了测试,看起来它运行良好。包括调用 this.inherited(arguments, ["bla"])
(dojo 调用方式 super("bla")
)
所以,我创建了这个函数来将 es6 class 转换为函数 class
function funcClass(type) {
const FuncClass = function (...args) {
const _source = Reflect.construct(type, args, this.constructor);
const keys = Reflect.ownKeys(_source);
for (const key of keys) {
if (!key.match || !key.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {
const desc = Object.getOwnPropertyDescriptor(_source, key);
!this[key] && Object.defineProperty(this, key, desc);
}
}
}
FuncClass.prototype = type.prototype;
return FuncClass;
}
和用法:
define(["dojo/_base/declare"],
function (declare) {
return declare("Man", funcClass(Human), {
});
});
我有一些 es6 class
class Human {
constructor(){
this.age = 0;
}
}
我想继承这个 class 使用 dojo 工具包
define(["dojo/_base/declare"],
function (declare) {
return declare("Man", Human, {
});
});
我收到错误 Class constructor Human cannot be invoked without 'new'
。
试图从 Human.constructor
和 Human.funcWrapper
class Human {
constructor(){
this.age = 0;
}
static funcWrapper(){
return new Human()
}
}
没有任何效果。
我知道我可以使用 babel 将我的代码转换为函数,但由于某些政治原因我不想要。
像往常一样,我发帖苦苦思索了几个小时,然后我提出了一个解决方案。到目前为止,我已经对其进行了测试,看起来它运行良好。包括调用 this.inherited(arguments, ["bla"])
(dojo 调用方式 super("bla")
)
所以,我创建了这个函数来将 es6 class 转换为函数 class
function funcClass(type) {
const FuncClass = function (...args) {
const _source = Reflect.construct(type, args, this.constructor);
const keys = Reflect.ownKeys(_source);
for (const key of keys) {
if (!key.match || !key.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {
const desc = Object.getOwnPropertyDescriptor(_source, key);
!this[key] && Object.defineProperty(this, key, desc);
}
}
}
FuncClass.prototype = type.prototype;
return FuncClass;
}
和用法:
define(["dojo/_base/declare"],
function (declare) {
return declare("Man", funcClass(Human), {
});
});