由于JavaScript共享的特性,任何对象都可以被放在同一环境下运行的代码修改。
例如:
var person = {name:"caibin'}
person.age = 21;
即使第一行定义了完整的person对象,那么第二行代码仍然可以对其添加属性,删除属性等。
我们有三个方法可以防止你做出这些行为。
一、不可扩展对象:
先来看person本身的扩展性:
Object.isExtensible(person); // true
接下来执行:
Object.preventExtensions(person);
Object.isExtensible(person) ;// false
person.age = 29;
console.log(person.age) ;//undefined
默认情况下,person.age = 29会静默失败,严格模式下,会报错。
然后,我们可以修改之前已经存在的person的属性。
例如:
person.name = "cb";
console.log(person.name); // cb
甚至可以删除:
delete person.name; // true;
console.log(person) ; // {}
小结:当对象被设置为不可扩展之后,不可以增加属性,但是可以修改,删除原来存在的属性。
二、密封的对象:
密封对象意味着:不可扩展,不能删除属性和方法,但是属性值是可以修改的。
先来看默认的对象的密封性和扩展性:
var caibin = {name:"caibin"};
console.log(Object.isSealed(caibin)); // false;
console.log(Object.isExtensible(caibin)); // true
接下来,执行密封操作:
Object.seal(caibin);
然后,检查扩展性:
console.log(Object.isExtensible(caibin)); // false 不可扩展
caibin.age = 21;
console.log(caibin.age) ;// undefined
删除属性:
delete caibin.name; // false; 删除失败
console.log(caibin.name) ;// caibin
修改属性:
caibin.name = "cb";
console.log(caibin.name);//cb 修改成功
三、冻结的对象:
这是最严格的防篡改级别,冻结的对象即不可扩展,又是密封的,对象的数据属性Writable被设置成false,这意味着不能修改属性的值。
先看对象默认的密封性,扩展性,冻结性:
var cb = {name:"caibin"}
console.log(Object.isExtensible(cb)) ;// true;
console.log(Object.isSealed(cb)) ;// false
console.log(Object.isFrozen(cb)); // false
然后,执行冻结操作:
Object.freeze(cb);
查看扩展性:
console.log(Object.isExtensible(cb)); // false
cb.age = 21;
console.log(cb.age); // undefined
查看密封性:
console.log(Object.isSealed(cb)); // true;
delete cb.name ;// false
console.log(cb.name) ;// caibin
查看Writable属性:
cb.name = "cb";
console.log(cb.name);//caibin 说明Writable属性被设置成false.