開發(fā)過程中,每個開發(fā)者定義的對象可能不想要被別的開發(fā)者所重寫或者新增對象屬性,這時候可以將對象變?yōu)榉来鄹膶ο?,當然防篡改對象也有分級別的
不可拓展對象
javaScript里面的對象默認都是可以拓展的,也就是說創(chuàng)建一個對象,可以給這個對象添加屬性和方法
// 此代碼在非嚴格模式下
var obj = {
name:'zyp',
age:'20'
}
obj.sayName = function(){
alert(this.name)
}
我們可以為新建的對象指定額外屬性或者方法,這些都是被允許的。使用Object.preventExtensions()方法可以將對象設置為不可拓展對象,這樣就不能再給對象添加屬性和方法了
Object.preventExtensions(obj)
obj.job = 'teacher'
obj.job // undefined
調用了Object.preventExtensions()方法后,就不能為obj對象添加方法和屬性了,在非嚴格模式下,給obj添加屬性和方法是靜默失敗的,在嚴格模式下,給不可拓展對象添加屬性和方法會報錯。
值得注意的是雖然不能給對象添加屬性和方法,但是原有對象已經(jīng)存在的成員是不受影響的,我們?nèi)匀豢梢孕薷暮蛣h除已有的屬性和方法。
區(qū)分對象是否可拓展
使用Object.isExtensible()方法可以確定對象是否可以拓展
var obj = {
name:'zyp'
}
var foo = {
name:'myy'
}
Object.preventExtensions(obj)
Object.isExtensible(obj) // false 不可拓展
Object.isExtensible(foo) // true 可以拓展
密封的對象
密封對象是不可拓展的,同時密封對象所擁有的成員的 [[Configurable]]特性會被設置為false,但是屬性值是可以修改的
Configurable是屬性的特性性,表示能否通過delete刪除屬性從而重新定義屬性,默認是為true。
屬性的特性就是用來描述js屬性的各種特征,具體可以上網(wǎng)查下資料,這里不細講~
通過Object.seal()方法密封對象
var obj = {
name:'zyp'
}
obj.age = 20
obj.age // undefined
delete obj.name
obj.name // zyp
在非嚴格模式下,給密封的對象添加屬性會靜默失敗,刪除已有屬性的操作也會被忽略。而在嚴格模式下,對密封對象添加和刪除屬性都會導致報錯。
區(qū)分對象是否被密封
使用Object.isSealed()方法可以知道對象是否被密封了,由于密封的對象也是不可拓展的,所有用Object.isExtensible()檢測密封的對象也是會返回false
var obj = {
name:'zyp'
}
var foo = {
name:'myy'
}
Object.seal(obj)
Object.isExtensible(obj) // false
Object.isExtensible(foo) // true
Object.isSealed(obj) // true
Object.isSealed(foo) // false
凍結的對象
js最嚴格的防篡改的級別是凍結對象。凍結的對象是不可拓展、又是密封的,而且對象的數(shù)據(jù)屬性[[Writable]]會被設置為false,意味者屬性不能被修改。
使用Object.freeze()可以凍結對象
var obj = {
name:'zyp'
}
Obj.freeze(Obj)
obj.age = 20
obj.age // undefined
delete obj.name
obj.name // zyp
obj.name = 'myy'
obj.name // zyp
非嚴格模式下對凍結的對象在執(zhí)行非法操作在非法操作(新增、刪除、修改等)會靜默失敗,而在嚴格模式下會報錯
區(qū)分對象是否被凍結
使用Object.isFrozen()方法可以知道對象是否被凍結了,由于凍結的對象是不可拓展的又是密封的,所有用Object.isExtensible()和Object.isSealed()檢測凍結對象是分別返回false和ture
var obj = {
name :'zyp'
}
Object.isExtensible(obj) // true 可拓展
Object.isSealed(obj) // false 不是密封對象
Object.isFrozen(obj) // false 不是凍結對象
Object.freeze(obj)
Object.isExtensible(obj) // false 不可拓展
Object.isSealed(obj) // true 密封的對象
Object.isFrozen(obj) // true 凍結的對象
防篡改對象是很有用的,當我們自己編寫js庫時候,最怕有人意外修改了庫的核心對象,凍結對象或者密封對對象能防止這些問題的發(fā)生。
有問題可以留言一起交流~~~
歡迎訪問我的個人網(wǎng)站zhengyepan.com