繁体   English   中英

如果writable属性默认为false,JS对象如何可变

[英]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 :{}中所述

  1. 表演? PropertyDefinition使用参数obj和true评估PropertyDefinitionList。

最终会引导您:

CreateDataProperty(O,P,V)

设newDesc为PropertyDescriptor {[[Value]]:V, [[Writable]]:true ,[[Enumerable]]:true,[[Configurable]]:true}。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM