为何用Object.defineProperty定义的属性在控制台打印对象时不可见?
为什么用Object.defineProperty添加的属性在控制台打印对象时不显示?
先看你的示例代码:
const object1 = {}; Object.defineProperty(object1, 'property1', { value: 42, writable: false }); object1.property1 = 77; // 严格模式下会抛出错误 console.log(object1); // 预期输出:{'property1': 42} console.log(object1.property1); // 输出42
问题的核心在于属性的可枚举性(enumerable):
- 用
Object.defineProperty定义属性时,若未显式指定enumerable配置项,它的默认值是false。 - 浏览器控制台打印对象(比如
console.log)默认只会展示**可枚举(enumerable: true)**的属性,所以property1不会出现在打印结果里。 - 属性的可枚举性仅影响遍历、打印这类批量操作,直接访问属性值不受限制,因此
object1.property1能正常返回42。
验证与解决方法
- 查看属性描述符,确认可枚举性:
console.log(Object.getOwnPropertyDescriptor(object1, 'property1')); // 输出:{ value: 42, writable: false, enumerable: false, configurable: false }
- 若想让属性在控制台显示,只需在定义时显式设置
enumerable: true:
const object1 = {}; Object.defineProperty(object1, 'property1', { value: 42, writable: false, enumerable: true // 开启可枚举性 }); console.log(object1); // 现在会输出 { property1: 42 }
补充说明:直接给对象赋值(比如object1.property1 = 42)时,属性的enumerable、writable、configurable默认都是true,所以这类属性能直接在控制台看到。
内容的提问来源于stack exchange,提问作者Oguzcan
相关产品推荐
相关产品推荐

