代码之家  ›  专栏  ›  技术社区  ›  Flamefire

定义一个get/set行为类似于普通属性的属性

  •  0
  • Flamefire  · 技术社区  · 6 年前

    考虑以下代码:

    function Foo(){this.bar=42;}
    Object.defineProperty(Foo.prototype, "baz", {
      get:function(){return 25;},
      set:function(val){}
    });
    var foo = new Foo();
    for(var x in foo) console.log(x);
    

    我可以(如果其余部分也实现了)使用 foo.bar foo.baz W/O注意到后者不是“不动产”。

    但它不会出现在中断代码的for循环中。

    我基本上想截取属性设置的时间,例如对其作出反应或委托给其他对象。

    我该怎么做?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Fissure King    6 年前

    您遇到的问题是由于您定义的属性不是 enumerable .从 mdn 以下内容:

    可枚举的

    true 如果且仅当此属性在枚举相应对象上的属性时出现。

    默认为 false .

    您可以通过指定 enumerable: true 在你的财产里 descriptor 以下内容:

    function Foo(){this.bar=42;}
    Object.defineProperty(Foo.prototype, "baz", {
      get:function(){return 25;},
      set:function(val){},
      enumerable: true
    });
    var foo = new Foo();
    for(var x in foo) console.log(x);
    

    编辑:对于getter在对象中定义的属性的可枚举性的注释,似乎是的,对象文本中定义的getter是可枚举的,但不是类定义中定义的。我不完全确定这在文档中的描述,但是如果有人找到我的答案,我会很乐意用这个更新我的答案。

    const foo = {
        get bar () {
            return 'baz';
        }
    }
    
    console.log(Object.keys(foo));
    // ["bar"]
    
    class Bar {
        get baz () {
            return 'qux';
        }
    }
    
    console.log(Object.keys(new Bar()));
    // []