深入瞭解Object.freeze()和Object.seal()

Object.freeze()

官方MDNObject.freeze()的說明,如下:

Object.freeze()方法可以凍結一個對象。一個被凍結的對象再也不能被修改;凍結了一個對象則不能向這個對象添加新的屬性,不能刪除已有屬性,不能修改該對象已有屬性的可枚舉性、可配置性、可寫性,以及不能修改已有屬性的值。此外,凍結一個對象後該對象的原型也不能被修改。freeze() 返回和傳入的參數相同的對象。

我們需要深入理解上面那幾句話什麼意思。

Object.freeze()做了哪些事情?

  • 設置Object.preventExtension(),禁止添加新屬性(絕對存在)
  • 設置writable爲false,禁止修改(絕對存在)
  • 設置configurable爲false,禁止配置(絕對存在)
  • 禁止更改訪問器屬性(getter和setter)

從上可知,Object.freeze()禁止了所有可設置的內容。

另外,可以使用Object.isFrozen()判斷一個對象是否是凍結對象。

Object.freeze()只是淺凍結,如果你理解淺拷貝就能理解淺凍結。

Object.seal()

官方MDNObject.freeze()的說明,如下:

Object.seal()方法封閉一個對象,阻止添加新屬性並將所有現有屬性標記爲不可配置。當前屬性的值只要可寫就可以改變。

從概念上看,Object.seal()相比Object.freeze()就比較好理解了。

Object.seal()做了哪些事情?

  • 設置Object.preventExtension(),禁止添加新屬性(絕對存在)
  • 設置configurable爲false,禁止配置(絕對存在)
  • 禁止更改訪問器屬性(getter和setter)

另外,可以使用Object.isSealed()判斷一個對象是否是封閉對象。

對比Object.freeze()和Object.seal()

使用Object.freeze()凍結的對象中的現有屬性是不可變的。用Object.seal()密封的對象可以改變其現有屬性。

拓展Object.preventExtensions()

官方MDNObject.preventExtensions()的說明,如下:

Object.preventExtensions()方法讓一個對象變的不可擴展,也就是永遠不能再添加新的屬性。

另外,可以使用Object.isExtensible()判斷一個對象是否可擴展。

//空對象是特殊情況,設置Object.preventExtensions()後,以下情況都爲true:
var empty = {};
Object.isFroze(empty) === true
Object.isSealed(empty) === true
Object.isExtensible(empty) === true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章