我正在使用以下包装器作为代理方法:
public static wrap(target) {
function construct(constructor, args) {
const c: any = function(this) {
return constructor.apply(this, args);
};
c.prototype = constructor.prototype;
return new c();
}
const f = (...args) => {
const instance = construct(target, args);
const descriptors = getMethodDescriptors(target, instance);
return new Proxy<T>(
instance,
new SomeProxyHandler(descriptors)
);
};
f.prototype = target.prototype;
return f;
}
当包装向下编译到ES5的类时,此方法效果很好,但是现在我试图以ES6为目标,我在constructor.apply(this, args)
遇到错误,说:
TypeError: Class constructor OneOfMyClasses cannot be invoked without 'new'
如何修复此代码,以便wrap
可以代理任何JavaScript目标的类并维护正确的原型链?
答案 0 :(得分:5)
最简单的方法是传播语法
const instance = new target(...args);
但是您也可以使用Reflect.construct
:
const instance = Reflect.construct(target, args);
如果包装的类应该是可扩展的,这甚至是必要的,那么您将不得不使用new.target
:
const instance = Reflect.construct(target, args, new.target);
顺便说一句,您的f
包装应该是proper function
not an arrow function,因为那些包装不能用new
调用(并且没有new.target
)。甚至可能更简单(使用静态方法和继承更好地工作),只需将整个target
类本身包装在Proxy
中并使用其construct
trap。