[英]How is the JS object mutable if the writable property defaults to false
我试图了解JS中的Object变异是如何工作的。 我在JS上遇到了可写属性。
var x = {name:'JohnSnow'};
Object.defineProperty(x, 'name', {
writable: false
};
现在更改name
属性对对象x
没有影响。 这是可以理解的,因为我已将其writable
属性更改为false
。
但是,我阅读的所有文档( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties#Parameters )都表示默认情况下此属性为false
。
如果默认情况下将writable
设置为false
,则默认情况下该对象不应该是不可变的,并且只有在将writable
设置为true
后才能变为可变。
我在这里理解对象属性的概念是错误的,因为我认为JS中的所有对象都有这个config
并且每个对象都有writable
属性。
通常只应在定义新属性时使用Object.defineProperty
- 否则,传递的属性描述符对象通常会被部分忽略,如9.1.6.3 ValidateAndApplyPropertyDescriptor的步骤2中所述 。
在步骤2中,如果当前描述符未定义,则新描述符desc
将仅作为新属性描述符。
在步骤6中,可以将现有数据属性切换为访问者属性(或相反),但是
保留已转换属性的[[Configurable]]和[[Enumerable]]属性的现有值,并将属性的其余属性设置为其默认值 。
步骤7和8不会更改当前描述符,它们只是验证并返回一个值。
因此,无论传递的描述符如何,如果该对象上已存在该属性,那么“new”描述符的writable
属性(或其缺失)将被完全忽略。
writable
默认为false
,但仅在使用Object.defineProperty
。
var x = {}; Object.defineProperty(x, 'name', { value: 'foo' }); x.name = 'bar'; console.log(x.name);
如上所示,如果在调用Object.defineProperty
时未提供writable
属性,则默认为false
。 这一切都意味着-这不是指定属性始终是在默认情况下不可写,它只是指定的属性定义与物业时不可写Object.defineProperty
。
在定义具有对象文字的对象时,对象属性是可写的,如12.2.6.7运行时语义:评估ObjectLiteral :{}中所述 :
- 表演? PropertyDefinition使用参数obj和true评估PropertyDefinitionList。
最终会引导您:
设newDesc为PropertyDescriptor {[[Value]]:V, [[Writable]]:true ,[[Enumerable]]:true,[[Configurable]]:true}。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.