如何使用Dojo扩展es6类

时间:2017-10-05 08:48:19

标签: javascript inheritance ecmascript-6 dojo

我有一些es6类

class Human {
    constructor(){
         this.age = 0;
    }
}

我想使用dojo toolkit继承此类

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将我的代码转换为函数,但由于某些政治原因我不想要。

1 个答案:

答案 0 :(得分:2)

像往常一样,我发布了几个小时的脑袋,然后我就找到了解决方案。到目前为止,我已经对它进行了测试,看起来它运行良好。包括调用this.inherited(arguments, ["bla"])(dojo调用super("bla")的方式)

所以,我已经创建了这个函数来将es6类​​转换为函数类

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), {
    });
});