深度分析JavaScript建立防篡改物件的
阿新 • • 發佈:2019-01-01
本文例項講述了JavaScript建立防篡改物件的方法。分享給大家供大家參考,具體如下:
之前的 JavaScript,開發人員可能會意外修改了別人的程式碼,甚至重寫原生物件!現在,在 ECMAScript 5 中可以定義防篡改物件啦O(∩_∩)O~
不過,一旦把物件定義為防篡改之後,就無法撤銷了哦。
1 不可擴充套件物件
預設情況下,所有的物件都是可擴充套件的,即可以隨意地新增屬性和方法。現在,使用 Object.preventExtensions(person) 方法後,物件就不可以擴充套件咯:
<script type="text/javascript"> var person = {name: "deniro"}; // person.age = 29; // console.log(person.age); console.log(Object.isExtensible(person));//true Object.preventExtensions(person); person.age = 15; console.log(person.age);//undefined console.log(Object.isExtensible(person));//false </script>
執行結果:
在非嚴格模式下,為物件新增新成員會靜默失敗;而在嚴格模式下,會丟擲錯誤。
雖然物件不能新增新成員,但仍然可以修改和刪除已有的成員。而 Object.isExtensible() 可以確定物件是否可擴充套件。
2 密封的物件
密封的物件不可以擴充套件,而且已有的成員的[[Configurable]]的特性也被設定為 false,這意味著不能刪除這個物件的屬性和方法咯,但屬性的值可以修改:
<script type="text/javascript"> var person = {name: "deniro"}; console.log(Object.isExtensible(person));//true console.log(Object.isSealed(person));//false Object.seal(person);//密封物件 console.log(Object.isExtensible(person));//false console.log(Object.isSealed(person));//true person.age = 29; console.log(person.age);//undefined delete person.name; console.log(person.name);//deniro </script>
執行結果:
跟不可擴充套件物件相似,在非嚴格模式下,刪除物件的已有成員會靜默失敗;而在嚴格模式下,會丟擲錯誤。
3 凍結的物件
物件的最嚴格的防篡改級別是凍結!凍結的物件既不能擴充套件,又是密封的,而且物件的資料屬性[[Writable]]被設定為 false,即屬性值無法被修改:
<script type="text/javascript"> var person = {name: "deniro"}; console.log(Object.isExtensible(person));//true console.log(Object.isSealed(person));//false console.log(Object.isFrozen(person));//false Object.freeze(person); console.log(Object.isExtensible(person));//false console.log(Object.isSealed(person));//true console.log(Object.isFrozen(person));//trueo person.age = 29; console.log(person.age);//undefined delete person.name; console.log(person.name);//deniro person.name = "lily"; console.log(person.name);//deniro </script>
執行結果:
對於 JavaScript 第三方庫的而言,凍結物件很有用,因為這些庫最怕被人意外修改了呀O(∩_∩)O~
為了學習工作與休閒娛樂互不衝突,現新建圈【碼農茶水鋪】用於程式設計師生活,愛好,交友,求職招聘,吐槽等話題交流,希望各位大神工作之餘到茶水鋪來喝茶聊天。群號:582735936