为什么我不能枚举定义为不可枚举的对象属性?

时间:2014-10-18 18:16:36

标签: javascript

我想获得通过Object.defineProperty方法定义的对象属性。

  

Object.defineProperty(obj, prop, descriptor)

     

Object.defineProperty()方法直接在对象上定义新属性,或修改对象上的现有属性,并返回该对象。

     
      
  • obj - 定义属性的对象。
  •   
  • prop - 要定义或修改的属性的名称。
  •   
  • descriptor:正在定义或修改属性的描述符。
  •   

所以,让我们举一个例子:

> a = {}
{}
> a.foo = "bar"
'bar'
> Object.keys(a)
[ 'foo' ]
> Object.defineProperty(a, "bar", { get: function () { return "foo"; }})
{ foo: 'bar' }
> a.bar
'foo'
> a.foo
'bar'
> Object.keys(a)
[ 'foo' ]
> for (k in a) { console.log(k); }
foo

在for循环中,如何列出bar属性(用defineProperty函数定义?

2 个答案:

答案 0 :(得分:4)

enumerable设为true会使其成为enumerable属性:

> Object.defineProperty(a, "b", { enumerable: true, get: function () { return "foo"; }})
{ foo: 'bar', b: [Getter] }
> for (k in a) { console.log(k); }
foo
b
> Object.keys(a)
[ 'foo', 'b' ]
  

enumerable

     

true当且仅当在枚举相应对象的属性时显示此属性。

     

默认为false

答案 1 :(得分:2)

您的问题都可以改善您的答案:

您的问题是:

  • 如何使用Object.defineProperty定义可枚举属性?

答案:通过设置属性参数enumerable:true

OR

  • 如何检索在对象上定义为不可枚举的属性?

答案:使用Object.getOwnPropertyNames,其效果与keys完全相同,但...返回所有自己的属性,意味着:包括不可枚举的属性,但不包括原型的属性(显然,原型链中没有属性)。