使用ES6代理陷阱Object.hasOwnProperty

Use ES6 proxy to trap Object.hasOwnProperty

我想用ES6代理套住以下常用代码:

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

但是看了proxy documentation之后,我不知道该怎么做,主要是因为has trap trap是针对in操作符的,好像不是在上面的代码中使用并且hasOwnProperty操作没有陷阱。

您可以使用 getOwnPropertyDescriptor handler 来捕获 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'));

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

其实我是要自己回答问题的,但是我太慢了,别人先回答了(还补充了很有用的信息)。不过,这是我想写的答案,以防它能以某种方式帮助某人:


似乎在调用 hasOwnProperty 时触发了 getOwnPropertyDescriptor 陷阱。因此,您可以通过执行以下操作来捕获 hasOwnProperty

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"];
}

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

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

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