1. 程式人生 > >深度分析JavaScript建立防篡改物件的

深度分析JavaScript建立防篡改物件的

本文例項講述了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