[英]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.