为何调用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
相关产品推荐
相关产品推荐

