我使用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
访问它时,它可以返回正确的值
所以我很困惑:为什么无法打印该属性但可以访问该属性?
答案 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))