为什么调用“defineProperties”后,我的对象变成了空

问题描述 投票:0回答:2

我有这个东西

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 },
});

在控制台中,我在使用defineProperties后得到了这个:

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

我的问题:为什么会发生这种情况?

我预计产品对象将是相同的,但仅在价格和数量上禁用可枚举和可写,并且不理解它是如何工作的(defineProperties) 还尝试写成像“price:{ enumerable: false, writable: false }”一样的结果

javascript object immutability
2个回答
0
投票

当您使用 Object.defineProperties() 时,您正在为要修改的对象属性定义属性描述符。

将 Object.defineProperties() 应用于具有价格和数量描述符的产品后,这两个属性都变为不可枚举和只读。因此,当您记录产品对象时,仅显示 name 属性,因为它是唯一的可枚举属性。价格和数量属性仍然存在于对象中,但它们不会显示在控制台中或可在循环中访问,并且您将无法直接更改它们的值。

如果您尝试直接访问价格和数量属性,您会发现它们仍然存在,但不可写:

console.log(product.price); // 1000
console.log(product.quantity); // 5

0
投票

您将

enumerable
设置为 false。因此,任何试图枚举键或条目的东西都不会看到它。

© www.soinside.com 2019 - 2024. All rights reserved.