对象的可配置属性和可写属性的区别

Difference between Configurable and Writable attributes of an Object

本文关键字:属性 区别 配置 对象      更新时间:2023-09-26

我看到以下关于javascript,对象数据属性属性

-
Configurable:指定该属性是否可以被删除或更改。

- Enumerable:指定该属性是否可以在for/in循环中返回。

- Writable:指定该属性是否可以修改

这里"可配置"answers"可写"表示相同的(属性是否可以更改),那么为什么我们需要两个单独的属性?

From: http://ejohn.org/blog/ecmascript-5-objects-and-properties/

Writable:如果为false,则该属性的值不能被修改。

Configurable:如果为false,任何试图删除该属性或更改其属性(Writable, Configurable,或Enumerable)的尝试都将失败。

Enumerable:如果为true,当用户执行for (var prop in obj){}(或类似)时,该属性将被遍历。

configurablewritable不代表同一件事。

configurable表示属性描述符和存在性

writable仅表示属性

属性的描述符包含值、可枚举、可配置和可写

场景1:通过赋值创建属性

'use strict';  // non-strict mode behaves slightly different
var foo = {};
foo.bar = 1;  // operated by CreateDataProperty*
// the above is the same as
Object.defineProperty(foo, 'bar', {
  value: 1,
  configurable: true,
  writable: true,
  // ...
});
  • CreateDataProperty是一个与ECMAScript规范一起定义的操作。

场景2:通过描述符

创建属性
'use strict';  // non-strict mode behaves slightly different
var foo = {};
Object.defineProperty(foo, 'bar', {
  value: 1,
  // configurable => false
  // writable => false
});
foo.bar = 2;    // throw TypeError: Cannot assign to read only property
Object.defineProperty(foo, 'bar', {
  value: 2
  // ...
}); // throw TypeError: Cannot redefine property
delete foo.bar; // throw TypeError: Cannot delete property

可配置防止任何尝试'重新定义'属性的键与Object.defineProperty, chrome将抛出一个错误符号

Uncaught TypeError: Cannot redefined property: foo

writable属性只是避免这个值被编辑

如果Writable设置为true,则表示对象属性的值可以更改。

如果Configurable设置为true,意味着对象属性的类型可以从数据属性更改为访问器属性(反之亦然);并且object属性可以被删除