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

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

我看到了以下有关 javascript、对象数据属性的内容

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

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

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

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

javascript object ecmascript-6 attributes
5个回答
35
投票

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

Writable:如果为 false,则该属性的值无法更改。

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

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


23
投票

configurable
writable
不代表同一事物。

configurable
表示属性描述符和存在

writable
仅表示属性 value

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

场景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,
  // ...
});

场景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
投票

可配置可防止任何使用

Object.defineProperty
“重新定义”键属性的尝试,chrome 将抛出错误信号

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

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


1
投票

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

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


0
投票

在 MDN 上,我认为

Object.defineProperty()
文档回答了这个问题。这是经过大量编辑的摘录。我将可配置和可写放在一起,以便两者更容易比较。我仍然包括
enumerable
,因为我认为它使答案更有用:

  • writable

    • true
      如果与属性关联的值可以通过赋值运算符更改。
  • configurable

    • 当设置为

      false
      ,

      • 该属性的类型不能在数据属性和访问器属性之间更改,并且
      • 该属性可能无法删除,并且
      • 其描述符的其他属性不能更改(但是,如果它是带有 writable: true 的数据描述符 [
        1
        ],则
        value
        可以 已更改,并且
        writable
        可以更改为
        false
        )。
  • enumerable

    • true
      当且仅当该属性在相应对象的属性枚举期间出现。

1:如果您想了解更多有关此术语的信息,链接的第一段详细描述了它。

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