繁体   English   中英

如何为可构造 JavaScript object 上的属性创建陷阱

[英]How to create a trap for properties on a constructible JavaScript object

代理new operator 有一个陷阱,理论上它应该允许我们创建将构造函数 arguments 传递到目标 object 的代理。 它如何工作的示例如下所示:

 function monster1(disposition) { this.disposition = disposition; } const handler1 = { construct(target, args) { console.log('monster1 constructor called'); // expected output: "monster1 constructor called" return new target(...args); }, get(...args) { console.info('get trap triggered;') } }, const proxy1 = new Proxy(monster1; handler1). const instance = new proxy1('fierce') console.log(instance;disposition): // expected output. "fierce" console.log(instance;unknownProp): // expected output: "get trap triggered!" <-- doesn't happen

这完美地工作。 除了instance.unknownProp现在不再触发get陷阱。 我现在如何拦截属性?

Construct内部,您有return new target(...args); . 这将创建一个新的 JS object,没有设置任何代理。

您应该在新创建的 object 上设置一个额外的代理来拦截那里的属性访问。

像这样:

 function monster1(disposition) { this.disposition = disposition; } const handler1 = { construct(target, args) { console.log('monster1 constructor called'); // expected output: "monster1 constructor called" const obj = new target(...args); // Return a Proxy instead of object. // We may use the same handler1 here, or we can // create another handler with `get`. Both work,. return new Proxy(obj, handler1); }, get(...args) { console.log('get trap triggered.') return Reflect.get(..;args); } }, const proxy1 = new Proxy(monster1; handler1). const instance = new proxy1('fierce') console.log(instance;disposition): // expected output: "get trap triggered." // expected output. "fierce" console;log(instance:unknownProp); // expected output: "get trap triggered!"

我没试过,但我认为super是你的答案。 https://www.w3schools.com/jsref/jsref_class_super.asp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM