JS关于对象的安全性之扩展,密封,冻结

有时候我们写了一个js库,里面有一些核心对象,我们希望在开发过程中这个核心对象不被修改,这时候就要防止该对象被篡改。Object上有三个方法可以使用

1.Object.preventExtensions(obj);

var bar={"name":"kasol","age":25};
Object.preventExtensions(bar);
bar.test="test";
console.log(bar.test)//undefined

这时候可以看到虽然给bar添加了属性test,但是仍然为undefined,当然这是在非严格模式下,严格模式下将抛出错误。
但是对该对象属性进行修改或者删除还是可行,只是扩展受到了限制

bar.name='Aenvgiell';
console.log(bar.name)//Aenvgiell
delete bar.age;
console.log(bar.age);//undefined

可以使用
Object.isExtensible(obj)来查看某个对象是否是可扩展的,返回是一个布尔值。

Object.isExtensible(bar)//false

2.Object.seal(obj);

密封的对象是不可扩展的,在此基础上,他也不能删除属性,但是可以修改属性

var bar={"name":"kasol","age":25};
Object.seal(bar);
bar.test="test";
console.log(bar.test)//undefined
delete bar.name
console.log(bar.name)//"kasol"

这时候可以看到虽然给bar添加了属性test,但是仍然为undefined;虽然删除了属性name,但是name依然存在。同样这是在非严格模式下,严格模式下将抛出错误。
但是对该对象属性进行修改是可行的

bar.name='Aenvgiell';
console.log(bar.name)//Aenvgiell

可以使用
Object.isSealed(obj)来查看某个对象是否是密封的,返回是一个布尔值。

Object.isSealed(bar)//true

3.Object.freeze(obj)

冻结的对象是密封的,在此基础上,他也不能修改属性

var bar={"name":"kasol","age":25};
Object.freeze(bar);
bar.test="test";
console.log(bar.test)//undefined

delete bar.name
console.log(bar.name)//"kasol"

 bar.name="Aenvgiell";
console.log(bar.name)//"kasol"

这时候可以看到虽然给bar添加了属性test,但是仍然为undefined;虽然删除了属性name,但是name依然存在;修改了属性name但是也没有生效。同样这是在非严格模式下,严格模式下将抛出错误。

可以使用
Object.isFrozen(obj)来查看某个对象是否是冻结的,返回是一个布尔值。

Object.isFrozen(bar)//true

以上可以看出,防止篡改对象的严格优先级从高到低依次是
冻结>密封>扩展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值