可调用对象(JS)

时间:2018-06-26 16:06:03

标签: javascript function class prototype

我正在尝试使类(CallableClass)可以使其子级成为可调用对象(既具有对象又具有功能)。我已经意识到了这一点,但是对我来说,它看起来非常棘手和棘手,而且我不确定性能。

有更好的方法吗?

这是最终完成工作的一个示例:

class A extends CallableClass {
    constructor(num) {
        super();
        this.num = num;
    }
    mult(num) {
        return this.num * num;
    }
    onCall() {  // method that will be executed on call
        console.log(this.mult(2));
    }
}


let a = new A(3);

a(); // 6

a.num = 5;
a(); // 10

a.ten = 10;
a.mult = function () {
    return this.num * this.ten;
}
a(); // 50;

这是实现:

class CallableClass {
    constructor() {
        let prototype = new.target.prototype;
        let classFunction = (...args) => 
            prototype.onCall.apply(classFunction, args);

        for (var property of Object.getOwnPropertyNames(prototype)) {
            classFunction[property] = prototype[property];
        }
        return classFunction;
    }
}

另一个版本使类和生成的对象共享相同的__proto__。但是它使用的是Object.setPrototypeOf,因此可能存在性能问题:

class CallableClass_commonProto {
    constructor() {
        let prototype = new.target.prototype;
        let classFunction = (...args) =>
            prototype.onCall.apply(classFunction, args);
        return Object.setPrototypeOf(classFunction, prototype);
    }
}

0 个答案:

没有答案