有時候我們寫了一個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
以上可以看出,防止篡改對象的嚴格優先級從高到低依次是
凍結>密封>擴展