Eri*_*nge 5 javascript proxy constructor ecmascript-6
我想创建一个构造函数对象,其继承正常工作,但捕获构造函数以便我可以操作实例对象。使用Proxy() 几乎解决了这个问题,但它似乎搞砸了继承。请注意以下没有代理的示例:
> const B = function() {}
undefined
> B.name
'B'
> class C extends B {}
[Function: C]
> B.prototype == C.prototype.__proto__
true
> var instance = new C()
undefined
> C.prototype == instance.__proto__
true
> instance.__proto__
C {}
Run Code Online (Sandbox Code Playgroud)
现在,如果我向 capture 添加一个代理construct(target,args),它将正确捕获构造函数,但它不会像没有代理那样完全保留内容。请注意,构造函数所做的只是向控制台打印一条消息,记录其捕获。但否则(我认为)它应该做出相同的反应。但是,当我创建一个类来扩展代理函数时,似乎扩展函数完全丢失了。请注意,最后四行给出的结果与上面不同。
> const handler = { construct(target,args) {
... console.log('Captured!'); return new target(...args); } }
undefined
> const proxy_B = new Proxy(B, handler)
undefined
> proxy_B.name
'B'
> class C2 extends proxy_B {}
[Function: C2]
> proxy_B.prototype == C2.prototype.__proto__
true
> var instance2 = new C2()
Captured!
undefined
> C2.prototype == instance2.__proto__
false
> instance2.__proto__
B {}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如何编写代理以正确处理这种情况?
您的处理程序不处理new.target. 请注意,target您的代理的 是B,return new target然后您将构造一个B实例而不是C实例。
不是使用 近似构造行为,而是new使用Reflect对象(特别是Reflect.construct)来使用精确的默认构造行为并传递陷阱方法的所有参数:
const handler = {
construct(target, args, newtarget) {
// ^^^^^^^^^
console.log('Captured!');
return Reflect.construct(target, args, newtarget);
// ^^^^^^^^^
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
830 次 |
| 最近记录: |