JavaScript 防篡改對象

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市算谈,隨后出現(xiàn)的幾起案子涩禀,更是在濱河造成了極大的恐慌,老刑警劉巖然眼,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艾船,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機丽声,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門礁蔗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來觉义,“玉大人雁社,你說我怎么就攤上這事∩购В” “怎么了霉撵?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洪囤。 經(jīng)常有香客問我徒坡,道長,這世上最難降的妖魔是什么瘤缩? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任喇完,我火速辦了婚禮,結(jié)果婚禮上剥啤,老公的妹妹穿的比我還像新娘锦溪。我一直安慰自己,他們只是感情好府怯,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布刻诊。 她就那樣靜靜地躺著,像睡著了一般牺丙。 火紅的嫁衣襯著肌膚如雪则涯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天冲簿,我揣著相機與錄音粟判,去河邊找鬼。 笑死峦剔,一個胖子當(dāng)著我的面吹牛档礁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羊异,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼事秀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了野舶?” 一聲冷哼從身側(cè)響起易迹,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎平道,沒想到半個月后睹欲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年窘疮,在試婚紗的時候發(fā)現(xiàn)自己被綠了袋哼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡闸衫,死狀恐怖涛贯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔚出,我是刑警寧澤弟翘,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站骄酗,受9級特大地震影響稀余,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜趋翻,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一睛琳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧踏烙,春花似錦师骗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至步脓,卻和暖如春愿待,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背靴患。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工仍侥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸳君。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓农渊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親或颊。 傳聞我的和親對象是個殘疾皇子砸紊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容

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