属性描述符
What are JavaScript Property Descriptors
属性描述符是一个对象,用于在另一个对象上配置另一个属性。
配置选项直接影响我们使用对象属性的方式。我们可以配置的一些选项是:
- writable – 与属性关联的值是否可以更改
- 可枚举 – 此属性是否出现在
for ...in
循环中 - value – 当前值
- configurable – 属性是否可以删除,以及描述符的属性(值和可写除外)是否可以更改。
让我们看一个例子:
const employee = { name: 'Tom', salary: 5000, }; // {value: 'Tom', writable: true, enumerable: true, configurable: true} console.log(Object.getOwnPropertyDescriptor(employee, 'name'));
要更改属性描述符,我们可以使用Object.defineProperty
:
// set the value associated with `name` as readonly Object.defineProperty(employee, 'name', {writable: false}); employee.name = 'Jim'; // {name: 'Tom', salary: 5000} console.log(employee);
在上面的示例中,我们可以看到通过将描述符编辑为不可写,值变为只读。
我们还可以使用value
配置选项来更新关联值:
Object.defineProperty(employee, 'salary', {value: 10000}); // {name: 'Tom', salary: 10000} console.log(employee);
我们可以为对象中尚不存在的属性设置配置选项:
Object.defineProperty(employee, 'age', {value: 50}); // {name: 'Tom', salary: 10000, age: 50} console.log(employee); // {value: 50, writable: false, enumerable: false, configurable: false} console.log(Object.getOwnPropertyDescriptor(employee, 'age'));
属性描述符选项的默认值是false
,当创建时使用Object.defineProperty
,而不是true
当对象只是内联时 – {key: 'value'}
。
我们还可以禁用从对象中删除属性的能力:
Object.defineProperty(employee, 'title', { value: 'programmer', configurable: false, }); // {name: 'Tom', salary: 10000, age: 50, title: 'programmer'} console.log(employee); delete employee['title']; // {name: 'Tom', salary: 10000, age: 50, title: 'programmer'} console.log(employee);
摘要
属性描述符只是一个对象,它包含另一个对象的属性的配置选项。我们可以将特定属性设置为只读,防止它们被删除,更新它们的值,并将它们排除在
for..in
循环之外。