JavaScript:无法打印由Object.defineProperty定义的对象属性

时间:2019-01-12 17:22:12

标签: javascript object

我使用Object.defineProperty方法来定义对象的属性:

const o = { a: 1 }
Object.defineProperty(o, 'b', {
  get() {
    return this.a
  }, set(value) {
    this.a = value
  }
})

但是,当我使用console.log尝试打印对象o时,似乎没有b属性。

但是当我尝试使用o.b访问它时,它可以返回正确的值

所以我很困惑:为什么无法打印该属性但可以访问该属性?

3 个答案:

答案 0 :(得分:1)

.defineProperty()添加的属性默认是不可枚举的

通过设置enumerable: true使它们“可见”

var foo = {}
Object.defineProperty(foo, "a", {
  get() { return "a"; }
});

Object.defineProperty(foo, "b", {
  get() { return "b"; },
  enumerable: true
});

console.log(Object.keys(foo));

答案 1 :(得分:0)

好吧,您拥有自己的枚举属性和对象的所有自身属性。

要获取所有可枚举的属性,可以采用Object.keys,对于非不可枚举的属性,也可以采用Object.getOwnPropertyNames

也许console.log仅显示对象的可枚举属性。此实现取决于供应商。

const o = { a: 1 }
Object.defineProperty(o, 'b', {
  get() {
    return this.a
  }, set(value) {
    this.a = value
  }
})

console.log(o);
console.log(Object.keys(o));
console.log(Object.getOwnPropertyNames(o));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

您可以使用Object.getOwnPropertyNames获取propertyNames

const o = { a: 1 }
Object.defineProperty(o, 'b', {
  get() {
    return this.a
  }, set(value) {
    this.a = value
  }
})

console.log(Object.getOwnPropertyNames(o))