【译文】Javascript如何避免一个对象被修改

避免对象被修改

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

  • 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

JavaScript教程



此条目发表在博客, 服务器, 程序开发, 计算机安全分类目录,贴了, , , , , , 标签。将固定链接加入收藏夹。