如何为可构造 JavaScript 对象的属性创建陷阱

How to create a trap for properties on a constructible JavaScript object

代理有一个trap for new operator,理论上应该允许我们创建将构造函数参数传递给目标对象的代理。它的工作原理示例如下所示:

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 陷阱。我现在如何拦截属性?

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

Construct 里面你有 return new target(...args);。这会创建一个新的 JS 对象,没有设置任何代理。

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

像这样:

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!"