避免对象被修改

根据需要有很多的方法可以锁定一个对象。

  • Object.freeze()
  • Object.seal()
  • Object.preventExtensions()

Object.freeze()

为了避免JavaScript对象被编辑,技术性的方法之一是使用Object.freeze()。冻结一个对象使得新的属性不允许加入,并且不允许移出和更改已有的属性。任何这样的企图都会失败,没有反应,或者抛出TypeError异常 (更一般的,当在严格模式也是如此)。

语法

Object.freeze(obj)

例子

var student = { name: "John", age: 10 };
Object.freeze(student);
student.grade = 2; // 严格模式会抛出一个错误
document.write(student.grade); //undefined
document.write("<br/>");
delete student.age; //delete property
document.write(student.age);
document.write("<br/>");
student.name = "Doe";
document.write(student.name);

输出

undefined
10
John

冻结一个对象对于表示一个逻辑上不可更改数据结构是有用得,尤其是在程序的一些地方如果改变了对象的属性会导致错误行为的时候。Object.freeze(…) 是比较浅显的,意思是讲被冻结的对象的值,仍然是可以改变的。

Object.seal()

Object.seal是Object.preventExtensions的功能性超集,避免对象属性的跟踪,并且避免对象已有属性的修改。也不允许删除属性的功能。

语法

Object.seal(obj)

例子

var student = { name: "John", age: 10 };
Object.seal(student);
student.grade = 2; //add new property
document.write(student.grade); //undefined
document.write("<br/>");
student.name = "Doe";
document.write(student.name);
document.write("<br/>"); //Doe
delete student.age;
document.write(student.age); // 10
document.write("<br/>");

输出

undefined
Doe
10

Object.preventExtensions()

Object.preventExtensions()设置对象的扩展属性extensible attribute为false,这样新的属性就不能添加了。这是持久改变: 一旦一个对象被设置为不能扩展,就不能再设置成可扩展了

例子

var student = { name: "John", age: 10 };
Object.preventExtensions(student);
document.write(Object.isExtensible(student));
document.write("<br/>");
student.grade = 2; //add new property
document.write(student.grade); //undefined
document.write("<br/>");

输出

false
undefined
原文链接