開發(fā)過程中今瀑,每個開發(fā)者定義的對象可能不想要被別的開發(fā)者所重寫或者新增對象屬性程梦,這時候可以將對象變?yōu)榉来鄹膶ο螅?dāng)然防篡改對象也有分級別的
不可拓展對象
javaScript里面的對象默認都是可以拓展的橘荠,也就是說創(chuàng)建一個對象屿附,可以給這個對象添加屬性和方法
// 此代碼在非嚴格模式下
var obj = {
name:'zyp',
age:'20'
}
obj.sayName = function(){
alert(this.name)
}
我們可以為新建的對象指定額外屬性或者方法,這些都是被允許的哥童。使用Object.preventExtensions()方法可以將對象設(shè)置為不可拓展對象,這樣就不能再給對象添加屬性和方法了
Object.preventExtensions(obj)
obj.job = 'teacher'
obj.job // undefined
調(diào)用了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]]特性會被設(shè)置為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
在非嚴格模式下,給密封的對象添加屬性會靜默失敗箱靴,刪除已有屬性的操作也會被忽略腺逛。而在嚴格模式下,對密封對象添加和刪除屬性都會導(dǎo)致報錯衡怀。
區(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
凍結(jié)的對象
js最嚴格的防篡改的級別是凍結(jié)對象抛杨。凍結(jié)的對象是不可拓展够委、又是密封的,而且對象的數(shù)據(jù)屬性[[Writable]]會被設(shè)置為false怖现,意味者屬性不能被修改茁帽。
使用Object.freeze()可以凍結(jié)對象
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
非嚴格模式下對凍結(jié)的對象在執(zhí)行非法操作在非法操作(新增、刪除屈嗤、修改等)會靜默失敗潘拨,而在嚴格模式下會報錯
區(qū)分對象是否被凍結(jié)
使用Object.isFrozen()方法可以知道對象是否被凍結(jié)了,由于凍結(jié)的對象是不可拓展的又是密封的饶号,所有用Object.isExtensible()和Object.isSealed()檢測凍結(jié)對象是分別返回false和ture
var obj = {
name :'zyp'
}
Object.isExtensible(obj) // true 可拓展
Object.isSealed(obj) // false 不是密封對象
Object.isFrozen(obj) // false 不是凍結(jié)對象
Object.freeze(obj)
Object.isExtensible(obj) // false 不可拓展
Object.isSealed(obj) // true 密封的對象
Object.isFrozen(obj) // true 凍結(jié)的對象
防篡改對象是很有用的铁追,當(dāng)我們自己編寫js庫時候,最怕有人意外修改了庫的核心對象茫船,凍結(jié)對象或者密封對對象能防止這些問題的發(fā)生琅束。
有問題可以留言一起交流~~~
歡迎訪問我的個人網(wǎng)站zhengyepan.com