如何使用 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.constructorHuman.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), {
    });
});