为什么我可以设置不可确定属性描述符的[可枚举性和]可写性
Why can I set [enumerability and] writability of unconfigurable property descriptors?
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty状态:
可配置:如果并且仅当此属性描述符的类型可以更改,并且该属性可以从相应的对象中删除时,为True。默认为
false
。
所以,我有一个
var x = Object.defineProperty({}, "a", {
value:true,
writable:true,
enumerable:true,
configurable:false
});
现在我可以玩x.a = false
、for(i in x)
等。但是即使描述符是应该是不可确定的,我也可以做
Object.defineProperty(x, "a", {writable:true}); // others defaulting to false
Object.defineProperty(x, "a", {}); // everything to false
Object.freeze(x); // does the same to the descriptors
反过来,再次将它们设置为true,或者尝试定义访问器描述符,现在会引发错误。确切地说:Object.defineProperty: invalid modification of non-configurable property
。
为什么我可以"降级"描述符,尽管他们说它们是不可配置的?
首先,即使configurable
是false
,writable
也可以从true
更改为false
。当configurable
为false
时,这是唯一允许的属性更改。允许这种转换是因为一些内置属性,包括(最显著的)数组(包括Array.prototype
)的length
属性,被指定为writable: true, configurable: false
。这是以前ECMAScript版本的遗留版本。如果configurable: false
阻止将writable
从true
更改为false
,则不可能冻结阵列。
Object.defineProperty
并不像你想象的那样工作。特别是,根据属性是否已经存在,它处理属性描述符的方式会有所不同。如果某个属性不存在,则描述符应该提供所有属性的定义,以便在使用描述符创建属性之前,为描述符中任何丢失的属性分配默认值。但是,对于已经存在的属性,描述符被视为该属性当前属性设置的增量更改集。描述符中未列出的属性不会更改。此外,在delta描述符中具有与当前属性属性值相同值的属性也被认为没有更改。所以以下都是合法的:
Object.defineProperty(x, "a", {writable:false}); // can always change writable to false.
//others attributes, not changed
Object.defineProperty(x, "a", {}); // no attributes, so nothing changes
Object.freeze(x); // same as Object.defineProperty(x, "a", {writable:false});
Object.defineProperty(x, "a", {enumerable:true, configurable: false}); //no change,
- 如何发送分配列表<字符串>到JavaScript数组或可枚举对象
- 枚举附加到文档的HTML对象的所有事件
- JavaScript数组的子类化破坏了快速枚举
- 为什么Javascript程序员更喜欢在代码中重复字符串作为常量,而不是使用枚举类型的对象
- 不可枚举的属性出现在 for..在 Chrome 中循环
- json模式v4如何根据枚举实现枚举
- 如何访问从 jstl foreach 到 jQuery 的枚举值
- 如何从 Javascript 访问 Java 枚举 (Java 1.8)
- JSON.stringify未序列化可枚举属性
- 为什么ES6 WeakMap's不可枚举
- 如何在另一个对象中枚举一个对象
- Javascript propertyIsNumerable-是否有可枚举的方法
- Javascript不可枚举属性
- TypeScript 中的枚举:JavaScript 代码在做什么
- 使用枚举作为类型/接口
- 如何将中继变量设置为枚举值
- 在默认情况下将可枚举设置为 false 的 JS 中创建对象属性的其他方法是什么
- 使用 Java 脚本中的 Bean 中设置的枚举值
- 为什么我可以设置不可确定属性描述符的[可枚举性和]可写性
- 有没有办法在Typescript中导出带有ES6设置的枚举?