簡體   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