Object.freeze()
官方MDN對Object.freeze()
的說明,如下:
Object.freeze()
方法可以凍結一個對象。一個被凍結的對象再也不能被修改;凍結了一個對象則不能向這個對象添加新的屬性,不能刪除已有屬性,不能修改該對象已有屬性的可枚舉性、可配置性、可寫性,以及不能修改已有屬性的值。此外,凍結一個對象後該對象的原型也不能被修改。freeze() 返回和傳入的參數相同的對象。
我們需要深入理解上面那幾句話什麼意思。
Object.freeze()做了哪些事情?
- 設置Object.preventExtension(),禁止添加新屬性(絕對存在)
- 設置writable爲false,禁止修改(絕對存在)
- 設置configurable爲false,禁止配置(絕對存在)
- 禁止更改訪問器屬性(getter和setter)
從上可知,Object.freeze()
禁止了所有可設置的內容。
另外,可以使用Object.isFrozen()
判斷一個對象是否是凍結對象。
Object.freeze()
只是淺凍結,如果你理解淺拷貝就能理解淺凍結。
Object.seal()
官方MDN對Object.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()
官方MDN對Object.preventExtensions()
的說明,如下:
Object.preventExtensions()方法讓一個對象變的不可擴展,也就是永遠不能再添加新的屬性。
另外,可以使用Object.isExtensible()
判斷一個對象是否可擴展。
//空對象是特殊情況,設置Object.preventExtensions()後,以下情況都爲true:
var empty = {};
Object.isFroze(empty) === true
Object.isSealed(empty) === true
Object.isExtensible(empty) === true