首页 > 解决方案 > 使用 get/set 定义一个属性,其行为类似于普通属性

问题描述

考虑以下代码:

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没有注意到后者不是“真实”属性。

但它没有出现在破坏我的代码的 for 循环中。

我基本上想在设置属性时进行拦截,例如对其做出反应或委托给其他东西。

我怎样才能做到这一点?

标签: javascriptproperties

解决方案


您遇到的问题是由于您定义的属性不是enumerable. 来自mdn

enumerable

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()));
// []

推荐阅读