我正在尝试使类(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);
}
}