2

我想使用 ES6 代理来捕获以下常见代码:

for (let key in trapped) {
    if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
    let value = trapped[key];
    //various code
}

但是查看代理文档后,我不知道该怎么做,主要是has陷阱陷阱是给in操作员的,上面的代码中似乎没有使用它,并且没有用于hasOwnProperty操作的陷阱。

4

2 回答 2

14

您可以使用getOwnPropertyDescriptor处理程序来捕获hasOwnProperty()调用。

例子:

const p = new Proxy({}, {
  getOwnPropertyDescriptor(target, property) {
    if (property === 'a') {
      return {configurable: true, enumerable: true};
    }
  }
});

const hasOwn = Object.prototype.hasOwnProperty;

console.log(hasOwn.call(p, 'a'));
console.log(hasOwn.call(p, 'b'));

这是指定的行为,而不是特定实现的怪癖:

于 2016-11-06T16:32:17.447 回答
1

我实际上是要自己回答我的问题,但是我太慢了,其他人先回答了它(此外还添加了非常有用的信息)。不过,这是我想写的答案,以防它可能以某种方式帮助某人:


似乎在调用getOwnPropertyDescriptor时会触发陷阱hasOwnPropertyhasOwnProperty因此,您可以通过执行以下操作进行陷阱:

getOwnPropertyDescriptor(target, name) {
    return {
        value : target[name],
        //use a logical set of descriptors:
        enumerable : true,
        configurable : true,
        writable : true
    };
}

另一部分是陷阱getownKeys也是:

get(target, name) {
    return {}; //replace this with a relevant object
}

//These will be iterated over as part of the for loop
ownKeys() {
    return ["RelevantProperty1", "RelevantProperty2"];
}

总而言之,由于您必须在 trap 时返回一组属性ownKeys,因此在此用例中使用代理似乎并没有使事情变得更好。我认为在大多数情况下,以下方法同样有效并且不那么脆弱:

let obj = {};
let keys = ["a" , "b"];
for (let key of keys) {
    obj[key] = {}; //relevant object
}

所以使用代理可能是矫枉过正。

于 2016-11-06T16:44:25.040 回答