如何在JavaScript中防止物件被修改?


ECMAScript 5 引入了幾種方法來防止物件被修改。這些預防措施確保沒有人意外或有意地更改物件的的功能。

共有3個級別的預防方法

1) 防止擴充套件

在這個級別,不能新增任何新的屬性或方法,但可以訪問現有的屬性或方法。這裡可以刪除相應物件。**Object.preventExtensions()** 是用於完成此任務的方法。它可以防止將來向物件新增任何新屬性。

示例

線上演示

<html>
<body>
<script>
   var object1 = {
      prop1: 1
   };
   Object.preventExtensions(object1);
   delete object1.prop1 // value got deleted
   try {
      Object.defineProperty(object1, 'prop2', {
      value: 2
   });
   } catch (err) {
   document.write(err);
   }
   document.write("</br>");
   document.write(object1.prop1);
</script>
</body>
</html>

輸出

TypeError: Cannot define property prop2, object is not extensible
undefined // deleted so undefined

2) 密封

它與防止擴充套件相同,此外它不允許刪除現有屬性或方法。要完成此任務,可以使用 **Object.seal()** 方法。

示例

線上演示

<html>
<body>
<script>
   var object1 = {
      prop1: 1
   };
   Object.seal(object1);
   object1.prop1 = 2;                 // value got changed
   delete object1.prop1;
   try {
      Object.defineProperty(object1, 'prop2', {
      value: 2
   });
   } catch (err) {
      document.write(err);
   }
   document.write("</br>");
   document.write(object1.prop1); // it gives value as 2 because of seal.
</script>
</body>
</html>

輸出

TypeError: Cannot define property prop2, object is not extensible
2  // because of seal the value can't be deleated but got updated

3) 凍結

除了密封的功能外,凍結甚至不允許訪問現有屬性。要凍結物件,我們使用 **Object.freeze()** 方法。它還可以使物件成為**不可變的**。

示例

線上演示

<html>
<body>
<script>
   var object1 = {
      prop1: 1
   };
   Object.freeze(object1);
   object1.prop1 = 2;          //  value got updated
   delete object1.prop1;        // value got deleted
   try {
      Object.defineProperty(object1, 'prop2', {
      value: 2
   });
   } catch (err) {
      document.write(err);
   }
   document.write("</br>");
   document.write(object1.prop1);  // it gives 1 as output despite value updated to 2
</script>
</body>
</html>

輸出

TypeError: Cannot define property prop2, object is not extensible
1 // because of freeze the value won't get delete and won't get update. 

更新於:2019年7月30日

325 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告