[英]Does Object.defineProperty check if the property is defined?
我需要為javascript對象定義屬性。
var obj = {};
obj['prop1'] = 1
以上述方式,我們可以定義屬性。
現在,讓我們使用Object.defineProperty
var obj = {};
Object.defineProperty(obj,'prop1',{value:1});
這是另一種方式。
兩者有什么區別?
Object.defineProperty
是否檢查屬性是否已定義?
我相信obj['prop1'] = 1
檢查屬性
謝謝 :)
編輯
那些之間有任何性能差異嗎?
直接對象訪問和Object.defineProperty
都不會“ 檢查 ”現有屬性。 這兩者之間的唯一區別是修改屬性描述符值的可能性。
屬性描述符是
這些都通過使用直接屬性訪問設置為true
。 使用Object.defineProperty
您可以選擇單獨設置這些屬性。 我建議你閱讀這個MDN,以了解其含義。
例如,如果屬性擁有標志configurable=false
,則無法覆蓋或刪除它(這可能是您的問題)。
關於表現:
由於Object.defineProperty
是一個需要每次執行的函數,因此它必須比對象的直接訪問慢。 我創建了這個小基准:
http://jsperf.com/property-access-with-defineproperty
但是,即使差異看起來很大,也可能不會忘記Object.defineProperty
的價值和原因。
在這兩種情況下,如果屬性存在,它的值將被覆蓋,否則將被創建
Mozilla 說 :
當屬性已存在時,Object.defineProperty()會嘗試根據描述符中的值和對象的當前配置來修改屬性。 如果舊描述符的可配置屬性設置為false(該屬性被稱為“不可配置”),則可以更改除可寫之外的任何屬性。 在這種情況下,也無法在數據和訪問者屬性類型之間來回切換。
如果屬性不可配置,則其可寫屬性只能更改為false。
嘗試更改不可配置的屬性屬性(除了可寫屬性)時,拋出TypeError,除非當前值和新值相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.