You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用Object.defineProperties后对象的price和quantity属性消失?

问题:Object.defineProperties设置属性不可枚举后,console.log为何只显示部分属性?

初始定义对象:

const product = { 
    name: "Laptop", 
    price: 1000, 
    quantity: 5 
};
console.log(product) // 输出: { name: 'Laptop', price: 1000, quantity: 5 }

执行属性描述符修改代码:

const descriptors = { enumerable: false, writable: false };

Object.defineProperties(product, {
    price: { ...descriptors },
    quantity: { ...descriptors },
});

修改后控制台输出:

console.log(product) // 输出: { name: 'Laptop' }

疑问:
为什么会出现这种情况?原本预期对象结构保持不变,仅将price和quantity设置为不可枚举、不可写,不理解Object.defineProperties的工作机制,直接写price:{ enumerable: false, writable: false }也得到相同结果。


原因解析
  • 不可枚举属性不会被默认遍历显示:当把属性的enumerable设为false时,该属性就变成了不可枚举属性。浏览器控制台打印对象时,默认只会遍历并展示可枚举属性,所以price和quantity不会出现在输出结果里。
  • 属性并未被删除:这两个属性依然存在于product对象中,你可以通过Object.getOwnPropertyDescriptor(product, 'price')查看它的描述符,也能直接通过product.price拿到它的初始值1000——只是writable: false会阻止你修改这个值。
  • Object.defineProperties会覆盖属性描述符:这个方法的作用就是修改或定义对象的属性描述符。当目标属性已存在时,它会用你传入的描述符覆盖原有配置。你这里只指定了enumerable和writable,直接把这两个属性的可枚举状态改成了false,自然就会导致控制台无法默认显示它们。

内容的提问来源于stack exchange,提问作者AVT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:43:26