# 防篡改对象
Javascript中任何对象都可以被同一环境中运行的代码修改,所以开发人员有时候需要定义防篡改对象来保护自己。
# 不可扩展对象
默认情况下所有对象都是可以扩展的(添加属性和方法)
let person = { name: 'addone' };
person.age = 20;
1
2
2
第二行为person对象扩展了age属性,当然你可以阻止这一行为,使用Object.preventExtensions()
let person = { name: 'addone' };
Object.preventExtensions(person);
person.age = 20;
person.age // undefined
1
2
3
4
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
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
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
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
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
2
3
4
5
6
7
8
9