JavaScript多人开发协作过程中,很可能会意外篡改他人代码。防篡改对象,通过不可扩展、密封、冻结来解决这个问题。
需要特别注意的是:一旦把对象定义为防篡改,就无法撤销了。
1、不可扩展对象
1 var person = {
2 name: "Person Name"
3 }
4 Object.preventExtensions(person);
5
6 person.age = 29;
7 alert(person.age); // undefined
通过 Object.isExtensible([Object]) 可以确定对象是否可以扩展。 true 可以扩展, false 不可以扩展。
不可扩展的对象,不能新增属性。
2、密封的对象
1 var person = {
2 name: "Person Name"
3 }
4 Object.seal(person);
5
6 person.age = 29;
7 alert(person.age); // undefined
8
9 delete person.name;
10 alert(person.name); // Person Name
通过 Object.isSealed([Object]) 可以确定对象是否被密封了。
被密封的对方,不能新增属性,也不能删除属性。
3、冻结的对象
1 var person = {
2 name: "Person Name"
3 }
4 Object.freeze(person);
5
6 person.age = 29;
7 alert(person.age); // undefined
8
9 delete person.name;
10 alert(person.name); // Person Name
11
12 person.name = "New Name";
13 alert(person.name); // Person Name
通过 Object.isFrozen([Object]) 来检测对象是否被冻结。
被冻结的对象,不能新增属性,并不能删除属性,也不能修改属性。
4、总结
冻结 > 密封 > 不可扩展
增 | 删 | 改 | |
---|---|---|---|
不可扩展 | ✖️ | ✔️ | ✔️ |
密封 | ✖️ | ✖️ | ✔️ |
冻结 | ✖️ | ✖️ | ✖️ |