JavaScript 防篡改對象

開發(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

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 防篡改對象 JS是若類型語言,變量和對象都可以被同一個運行環(huán)境中的代碼修改掉;開發(fā)人員很可能會意外地修改別人的代碼...
    源境閱讀 1,082評論 0 0
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,337評論 6 13
  • ??JavaScript 是一種極其靈活的語言,具有多種使用風格。 ??一般來說,編寫 JavaScript 要么...
    霜天曉閱讀 829評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,632評論 1 32
  • 首發(fā)于segmentfault:JavaScript 對象所有API解析 之前看到【深度長文】JavaScript...
    若川i閱讀 501評論 0 1

友情鏈接更多精彩內(nèi)容