# 防篡改对象

Javascript中任何对象都可以被同一环境中运行的代码修改,所以开发人员有时候需要定义防篡改对象来保护自己。

# 不可扩展对象

默认情况下所有对象都是可以扩展的(添加属性和方法)

let person = { name: 'addone' };
person.age = 20;
1
2

第二行为person对象扩展了age属性,当然你可以阻止这一行为,使用Object.preventExtensions()

let person = { name: 'addone' };
Object.preventExtensions(person);
person.age = 20;
person.age // undefined
1
2
3
4

你还可以用Object.isExtensible()来判断对象是不是可扩展的

let person = { name: 'addone' };
Object.isExtensible(person); // true

Object.preventExtensions(person);
Object.isExtensible(person); // false
1
2
3
4
5

# 密封的对象

密封对象不可扩展,且不能删除属性和方法。使用Object.seal()来密封一个对象。

let person = { name: 'addone' };
Object.seal(person);

person.age = 20;
delete person.name;

person.age // undefined
person.name // addone
1
2
3
4
5
6
7
8

相对的也有Object.isSealed()来判断是否密封。

let person = { name: 'addone' };
Object.isExtensible(person); // true
Object.isSealed(person); // false

Object.seal(person);
Object.isExtensible(person); // false
Object.isSealed(person); // true
1
2
3
4
5
6
7

# 冻结的对象

这是最严格的防篡改级别,冻结的对象既不可扩展,又密封,且不能修改。使用Object.freeze()来冻结一个对象。

let person = { name: 'addone' };
Object.freeze(person);

person.age = 20;
delete person.name;
person.name = 'addtwo'

person.age // undefined
person.name // addone
1
2
3
4
5
6
7
8
9

同样也有Object.isFrozen()来检测

let person = { name: 'addone' };
Object.isExtensible(person); // true
Object.isSealed(person); // false
Object.isFrozen(person); // false

Object.freeze(person);
Object.isExtensible(person); // false
Object.isSealed(person); // true
Object.isFrozen(person); // true
1
2
3
4
5
6
7
8
9
Last Updated: 5/2/2020, 2:51:33 PM