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

Posted

技术标签:

【中文标题】对象的可配置属性和可写属性之间的区别【英文标题】:Difference between Configurable and Writable attributes of an Object 【发布时间】:2014-06-28 17:19:28 【问题描述】:

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

——可配置:指定属性是否可以删除或更改。

——可枚举:指定属性是否可以在 for/in 循环中返回。

——可写:指定属性是否可以更改。

这里的“Configurable”和“Writable”代表的是同一个(属性是否可以改变),那我们为什么需要两个单独的属性呢?

【问题讨论】:

I don't understand writable and configurable property attributes of Objects的可能重复 【参考方案1】:

发件人:http://ejohn.org/blog/ecmascript-5-objects-and-properties/

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

Configurable:如果为 false,任何删除属性或更改其属性(可写、可配置或可枚举)的尝试都将失败。

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

【讨论】:

【参考方案2】:

configurablewritable 代表的不是同一个东西。

configurable 表示属性描述符和存在

writable 仅表示属性

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

场景1:通过assignment

创建属性
'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 spec 一起定义的操作。

场景2:通过descriptor

创建属性
'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

【讨论】:

【参考方案3】:

Configurable 可防止任何尝试使用Object.defineProperty“重新定义”键的属性,chrome 会抛出错误标志

未捕获的类型错误:无法重新定义属性:foo

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于对象的可配置属性和可写属性之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

面向对象

Object.freeze()

Object.freeze

Object.freeze(); 方法冻结一个对象。

js-权威指南学习笔记5

JS对象属性