簡體   English   中英

Object.defineProperty是否檢查屬性是否已定義?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM