使用ES6代理捕获Object.hasOwnProperty

时间:2016-11-06 16:30:25

标签: javascript ecmascript-6 hasownproperty es6-proxy

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

from Scene_tag  where Tag_id = T.id

但在审核proxy documentation后,我不知道该怎么做,主要是因为for (let key in trapped) { if (!Object.prototype.hasOwnProperty.call(obj, key)) continue; let value = trapped[key]; //various code } 陷阱陷阱适用于has运算符,但似乎不是在上面的代码中使用,in操作没有陷阱。

2 个答案:

答案 0 :(得分:8)

您可以使用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'));

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

答案 1 :(得分:1)

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

调用getOwnPropertyDescriptor时似乎会触发hasOwnProperty陷阱。因此,您可以通过执行以下操作来捕获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时返回一个属性数组,所以使用代理似乎并没有在这个用例中做得更好。我认为,对于大多数情况,以下情况也会起作用并且不那么脆弱:

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

因此使用代理可能会有点过分。