一膘婶、為什么需要引入防篡改對象蛀醉?
1.
為什么?JavaScript 共享的本質(zhì)一直是開發(fā)人員心頭的痛,因?yàn)槿魏螌ο蠖伎梢员辉谕画h(huán)境中運(yùn)行的代碼修改脊岳。
2.
解決:我們可以手工設(shè)置每個對象屬性的
[[Configurable]]
、
[[Writable]]
、
[[Enumerable]]
捻悯、
[[Value]]
旦签、
[[Get]]
以及
[[Set]]
特性,同樣我們可以設(shè)置對象的行為醉锄。
一、不可擴(kuò)展的對象
1.
默認(rèn)情況下恳不,所有對象都是可以擴(kuò)展的烟勋。也就是說,任何時候都可以向?qū)ο笾刑砑訉傩院头椒?/p>
??????? var o = {
??????????? name :
"zhang"
??????? }
??????? o.age =
23
;
??????? alert(o.age);?????? //
23
2.
使用Object.preventExtensions()方法可以改變這個行為卵惦,讓你不能再給對象添加屬性和方法沮尿。
??????? var o = {
??????????? name :
"zhang"
??????? }
??????? alert(Object.isExtensible(o));? //
true
??????? Object.preventExtensions(o);
??????? o.age =
23
;
??????? alert(o.age);?????? // undefined
??????? alert(Object.isExtensible(o));? //
false
二、密封的對象
??? 密封對象不可擴(kuò)展赴邻,而且已有成員的
[[Configurable]]
特性將被設(shè)置為
false
啡捶。這就意味著不能刪除屬性和方法,因?yàn)椴荒苁褂肙bject.defineProperty()把數(shù)據(jù)屬性修改為訪問器屬性徒溪,或者相反金顿。屬性值是可以修改的。
??????? var o = {
??????????? name :
"zhang"
??????? }
??????? // alert(Object.isExtensible(o));?? //
true
??????? // alert(Object.isSealed(o));?? //
false
??????? // 不能添加屬性和方法
??????? Object.seal(o);
??????? o.age =
23
;
??????? // alert(o.age);??????? // undefined
??????? // 不能刪除屬性
??????? delete o.name;
??????? // alert(o.name);?????? // zhang
??????? // 可以修改已有屬性的值
??????? o.name =
"li"
;
??????? alert(o.name);
??????? alert(Object.isExtensible(o));? //
false
??????? alert(Object.isSealed(o));? //
true
三渠概、凍結(jié)的對象
??? 凍結(jié)的對象既不可擴(kuò)展嫂拴,又是密封的,而且對象數(shù)據(jù)屬性的
[[Writable]]
特性會被設(shè)置為
false
猪狈。如果定義
[[Set]]
函數(shù)辩恼,訪問器屬性仍然是可寫的谓形。
??????? var o = {
??????????? name :
"zhang"
??????? }
??????? // alert(Object.isExtensible(o));?? //
true
??????? // alert(Object.isSealed(o));?? //
false
??????? // alert(Object.isFrozen(o));?? //
false
??????? // 不能添加屬性和方法
??????? Object.freeze(o);
??????? o.age =
23
;
??????? // alert(o.age);??????? // undefined
??????? // 不能刪除屬性
??????? delete o.name;
??????? // alert(o.name);?????? // zhang
??????? // 不可以修改屬性
??????? o.name =
"li"
;
??????? // alert(o.name);
??????? alert(Object.isExtensible(o));? //
false
??????? alert(Object.isSealed(o));? //
true
??????? alert(Object.isFrozen(o));? //
true