【问题标题】:Use ES6 proxy to trap Object.hasOwnProperty使用 ES6 代理捕获 Object.hasOwnProperty
【发布时间】:2016-11-06 16:30:25
【问题描述】:

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

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

但是查看proxy documentation之后,我不知道该怎么做,主要是因为has陷阱陷阱是针对in运算符的,上面的代码中似乎没有使用它和那里不是hasOwnProperty 操作的陷阱。

【问题讨论】:

    标签: javascript ecmascript-6 hasownproperty es6-proxy


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我本来打算自己回答我的问题,但是我太慢了,其他人先回答了它(此外还添加了非常有用的信息)。不过,这是我想写的答案,以防它可能对某人有所帮助:


      似乎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
      }
      

      所以使用代理可能有点过头了。

      【讨论】:

      • 通常最好在发布问题之前准备好答案,这样您就可以一次发布。节省发生此类情况。不过,还是有用的。
      • @vlaz 说得好。以后我会记住的。不过,我很高兴 Gothdo 和其他人详细说明了该机制的工作原理。
      猜你喜欢
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2023-03-18
      • 2015-07-24
      • 2023-03-11
      • 1970-01-01
      • 2020-03-12
      相关资源
      最近更新 更多