如何在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.
廣告