首頁技術(shù)文章正文

對象中有多個模塊,怎樣防止某一個鍵被意外改寫、覆蓋?

更新時間:2023-08-18 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

因?yàn)槊恳粋€Symbol的值都是不相等的,所以將Symbol作為對象的屬性名可以保證屬性不重名。這適用于對象由多個模塊組成的情況,可以防止某一個鍵被意外改寫或覆蓋,示例代碼如下。

<script>
  let MY NAME = Symbol ();
  //第1種寫法
  let a = {}
  a[MY_NAME] = 'Hello!';
  console.log(a);// 輸出結(jié)果:{ Symbol():“Hello!"}
  //第2種寫法
  let a = {
     [MY_NAME]: 'Hello!',
  };
  console.log(a);//輸出結(jié)果:{Symbol():“Hello!”}
  //第3種寫法
  let a = ();
  Object.defineProperty(a, MY_NAME, ( value: 'Hello!'));
  console.log(a);//輸出結(jié)果:(Symbol():“Hello!“)
</script>

上述代碼通過方括號結(jié)構(gòu)或Object.defineProperty 將對象的屬性名指定為一個Symbol 值。使用第1種寫法時,將Symbal值作為對象屬性名要使用方括號而不能用點(diǎn)運(yùn)算符。這是因?yàn)辄c(diǎn)運(yùn)算符后面一直是字符串,導(dǎo)致a的屬性名實(shí)際上是一個字符串,而不是一個Symbol值。使用第2種寫法時,若想在對象內(nèi)部使用Symbal值定義屬性,Symbol 值必須放在方括號中,如果MY_NAME不放在方括中,該屬性的鍵名就是字符串MY_NAME,而不是MY_NAME所代表的那個Symbal值。使用第3種寫法時,會直接在一個a對象上定義一個新屬性,并返回此對象。以上3種方式的輸出結(jié)果相同。


分享到:
在線咨詢 我要報名
和我們在線交談!