Javascript代理:这两种情况有什么区别?

时间:2017-03-22 14:28:59

标签: javascript proxy

我认为我有点理解JS代理对象的行为,但我遇到了一些奇怪的效果。

我定义了一个简单的处理程序,它通过检查以下内容来覆盖get():

  1. 检查对象属性是否为私有(此处定义为“以下划线开头”)=>返回值'private'

  2. 检查对象属性是否已定义=>如果不是,则返回值42而不是值。

  3. 这是我定义处理程序的方式:

    var handler = {
      get: function(target, property){
        if (property.indexOf('_') === 0) {
          return 'private';
        }
        else {
          return property in target ? target[property] : 42;
        }
      }
    };
    

    然后,我在两种不同的情况下使用处理程序。

    首先,我使用代理来定义对象,这样就可以了:

    const parent = new Proxy({}, handler); 
    parent._a = 10; 
    parent.b = 20; 
    console.log(parent._a, parent.b); // outputs: private, 20  -- OK! 
    console.log('c' in parent, parent.c); // outputs: false, 42 -- OK!
    

    其次,我创建了一个从派生的对象 p ,这里有一些我不理解的奇怪行为:

    const p = Object.create(parent);
    p._a = 1;
    p.b = 2;
    console.log(p._a, p.b); // outputs: 1, 2 <--- why is this not caught by the proxy?
    console.log('c' in p, p.c);// outputs: false, 42 <--- why is this caught by the proxy?
    

    我会理解,如果没有应用于p的getter被困在代理中,但为什么 pc 调用被困,而 p._a 不是?

0 个答案:

没有答案