簡單來說,這三個Object的methods都是用來「鎖定」物件,讓物件無法被修改或刪除屬性(props),但各自有不同的影響範疇:

可新增屬性可刪除屬性可修改屬性
preventExtensions
seal
freeze

用一個簡單的例子來一步一步說明

先建立一個物件,在正常情況之下,我們可以任意新增、修改、刪除物件中的屬性:

然後我們用Object.preventExtensions(obj)來限制擴展,就會發現當我們嘗試要新增屬性時不會發生作用:

接著我們用Object.seal(obj)來防止新增並限制刪除,此時物件僅剩下可修改既有屬性的功能:

接著再以Object.freeze(obj)來鎖定物件,便會發現物件已無法再做任何修改:

對於子物件的影響

這三個methods執行後,都不會影響子物件的任何操作。

如何解除?

答案是沒辦法。一旦鎖定過的部分,就無法回頭。也就是說,當你執行過freeze,即便再執行一次seal,還是會整個都鎖定住。

不過,關於解除,如果只是一個簡單的Object,還可以用Object.assign來clone一份:
obj = Object.assign({}, obj);

但如果是Class, Proxy…etc. 就沒辦法這麼簡單去做一個類似復原的動作了。