JS關於對象的安全性之擴展,密封,凍結

有時候我們寫了一個js庫,裏面有一些核心對象,我們希望在開發過程中這個核心對象不被修改,這時候就要防止該對象被篡改。Object上有三個方法可以使用

1.Object.preventExtensions(obj);

var bar={"name":"kasol","age":25};
Object.preventExtensions(bar);
bar.test="test";
console.log(bar.test)//undefined

這時候可以看到雖然給bar添加了屬性test,但是仍然爲undefined,當然這是在非嚴格模式下,嚴格模式下將拋出錯誤。
但是對該對象屬性進行修改或者刪除還是可行,只是擴展受到了限制

bar.name='Aenvgiell';
console.log(bar.name)//Aenvgiell
delete bar.age;
console.log(bar.age);//undefined

可以使用
Object.isExtensible(obj)來查看某個對象是否是可擴展的,返回是一個布爾值。

Object.isExtensible(bar)//false

2.Object.seal(obj);

密封的對象是不可擴展的,在此基礎上,他也不能刪除屬性,但是可以修改屬性

var bar={"name":"kasol","age":25};
Object.seal(bar);
bar.test="test";
console.log(bar.test)//undefined
delete bar.name
console.log(bar.name)//"kasol"

這時候可以看到雖然給bar添加了屬性test,但是仍然爲undefined;雖然刪除了屬性name,但是name依然存在。同樣這是在非嚴格模式下,嚴格模式下將拋出錯誤。
但是對該對象屬性進行修改是可行的

bar.name='Aenvgiell';
console.log(bar.name)//Aenvgiell

可以使用
Object.isSealed(obj)來查看某個對象是否是密封的,返回是一個布爾值。

Object.isSealed(bar)//true

3.Object.freeze(obj)

凍結的對象是密封的,在此基礎上,他也不能修改屬性

var bar={"name":"kasol","age":25};
Object.freeze(bar);
bar.test="test";
console.log(bar.test)//undefined

delete bar.name
console.log(bar.name)//"kasol"

 bar.name="Aenvgiell";
console.log(bar.name)//"kasol"

這時候可以看到雖然給bar添加了屬性test,但是仍然爲undefined;雖然刪除了屬性name,但是name依然存在;修改了屬性name但是也沒有生效。同樣這是在非嚴格模式下,嚴格模式下將拋出錯誤。

可以使用
Object.isFrozen(obj)來查看某個對象是否是凍結的,返回是一個布爾值。

Object.isFrozen(bar)//true

以上可以看出,防止篡改對象的嚴格優先級從高到低依次是
凍結>密封>擴展

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章