概念
首先所有对象在默认情况下都是可篡改的,可以进行相应的防篡改操作
防篡改的对象包含三种
不可添加新属性和方法,但可修改原有属性 叫不可拓展对象
不可删除,添加,但可修改 叫密封对象
完全不可操作,包含删除,添加,修改 叫冻结对象
几个方法
不可拓展对象
Object.preventExtensions()
var obj = {
name: '123'
}
Object.preventExtensions(obj)// 禁止添加属性,但可删除或修改原属性
obj.name = '456'// return 456
delete obj.name // return true
Object.isExtensible()
判断该对象是否支持拓展
var obj = {
name: '123'
}
Object.isExtensible(obj) // return true
Object.preventExtensions(obj) // 阻止篡改对象
Object.isExtensible(obj) // return false
密封对象
Object.seal()
var obj = {
name: '123'
}
// 密封对象
Object.seal(obj)
obj.age = 1 // 注意!!此时浏览器不会报错!
console.log(obj.age) // 这里返回undefined,证明了该属性并未成功添加
delete obj.name// 注意!!此时浏览器不会报错!
console.log(obj.name) // 123 证明了对象的属性并未删除
Object.isSealed()
判断对象是否密封
var obj = {
name: "Tom"
}
console.log(Object.isExtensible(obj)); // true
console.log(Ojbect.isSealed(obj)); // false
Object.seal(obj);
console.log(Object.isExtensible(obj)); // false
console.log(Ojbect.isSealed(obj)); // true
冻结对象
Object.freeze()
var obj = {
name: "123"
}
Object.freeze(obj); // 冻结对象
obj.age = 21;
console.log(obj.age); // undefined 不可扩展
delete obj.name;
console.log(obj.name); // 123 不可删除
obj.name = "Bob";
console.log(obj.name); // 123 不可修改
Object.isFrozen()
判断对象是否为冻结对象
var obj = {
name: "123"
}
// 未冻结之前
console.log(Oject.isExtensible(obj)); // true
console.log(Oject.isSealed(obj)); // false
console.log(Oject.isFrozen(obj)); // false
// 冻结对象之后
Object.freeze(obj); // 冻结对象
console.log(Oject.isExtensible(obj)); // false
console.log(Oject.isSealed(obj)); // true
console.log(Oject.isFrozen(obj)); // true