JavaScript防篡改对象总结

in 前端技术 with 0 comment

C1m9zT.md.jpg

part.1 使用背景

团队开发中,有两个问题一直让开发人员很头疼

所以开发人员提出了N种方法来减少或者避免这些情况的发生
ECMAScript 5提出了一种定义防篡改对象的做法来解决这个问题

part.2 简述防篡改对象

ES5在Obejct对象中定义了一系列方法,用于给对象设置不同级别的防篡改属性和验证对象的防篡改属性
防篡改对象设置了三个保护级别,分别是:

part.3 不可拓展对象

使用Object.preventExtensions()方法可以将对象设置为不可拓展对象,不可拓展对象将无法为其添加属性和方法

var person = {name :"mragon"};
Object.preventExtensions(person);

person.age = 29;
alert(person); //undefined

使用Object.isExtensible()方法可以确定对象是否可以拓展

var person = {name:"mragon"}
alert(Object.isExtensible(person)); //true

Object.preventExtensions(person);
alert(Object.isExtensible(person)); //false

part.4 密封对象

使用Object.seal()方法可以将对象设置密封对象,将无法为其添加属性和方法,并且不能删除属性和方法

var person = {name :"mragon"};
Object.seal(person);

person.age = 29;
alert(person); //undefined

delete person.name;
alert(person.name); //"mragon"

使用Object.isSealed()方法可以确定对象是否密封

var person = {name:"mragon"}
alert(Object.isSealed(person)); //false

Object.seal(person);
alert(Object.isSealed(person)); //true

part.5 冻结对象

使用Object.freeze()方法可以将对象设置冻结对象,将无法为其添加属性和方法,不能删除属性和方法,并且不能修改其属性

var person = {name :"mragon"};
Object.freeze(person);

person.age = 29;
alert(person); //undefined

delete person.name;
alert(person.name); //"mragon"

person.name = "miao";
alert(person.name); //"mragon"

使用Object.isFrozen()方法可以确定对象是否冻结

var person = {name:"mragon"}
alert(Object.isFrozen(person)); //false

Object.seal(person);
alert(Object.isFronzen(person)); //true

part.6 小结

密封对象同时具备不可拓展对象的属性
所以对密封对象使用Object.isExtensible()方法检验的结果与不可拓展对象一致
冻结对象同理,使用Object.isSealed()方法检验冻结对象的结果与密封对象结果一致。

在非严格模式下,对这三种对象的非法操作或被忽略,在严格模式下会抛出错误

参考资料:《JavaScript高级程序设计》

Responses