JavaScript防篡改对象

任何人对象都可以被同一环境中运行的代码修改。开发人员很可能会意外地修改别人的代码,甚至用不兼容的功能重写原生的代码。ECMAScript解决了这个问题,可以让开发人员防篡改对象。
注意:一旦把对象定义为防篡改,就无法撤销。
1.不可扩展对象:
在默认情况下,所有的对象都是可以扩展的。也就是说,任何时候都可以向对象中添加属性和方法。使Object.prevent
Extensions()方法可以改变这个行为,让你不能再给对象添加属性和方法。

var person={name:"远方"}
Object.preventExtensions(person);
person.age="18";
console.log(person.age);//undefined
console.log(Object.isExtensible(person));//false

在使用Object.preventExtensions()方法后,在非严格模式下,给对象添加新成员会导致静默失败,因此person.age
是undefined。而在严格模式下,尝试给不可扩展的对象添加新成员会导致抛出错误。
虽然不能给对象添加新成员,但已有的成员则不受影响。还可以修改和删除已有的成员。使用Object.isExtensible()方法可以确定对象是否可以扩展。
2.密封的对象
密封的对象不可扩展,也不能删除属性和方法,属性值可以修改。

var person={name:"远方"}
Object.seal(person);
person.age="18";
console.log(person.age);//undefined
delete person.name;
console.log(person.name);//"远方"
console.log(Object.isExtendsible(person));//false
console.log(Object.isSealed(person));//true

这是在非严格模式下的显示,在严格模式下,尝试添加或删除对象都会导致抛出错误。可以使用Object.isSealed()方法确定对象是否被密封。
3.冻结的对象
冻结的对象即不可扩展,又是密封的,而且对象数据属性的[[Writable]]特性会被设置为false。

var person={name:"远方"}
Object.freeze(person);
person.age="18";
console.log(person.age);//undefined
delete person.name;
console.log(person.name);//"远方"
person.name="星星";
console.log(person.name);//"远方"
console.log(Object.isExtendsible(person));//false
console.log(Object.isSealed(person));//true
console.log(Object.isFrozed(person));//true

在严格模式下,同样会抛出错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值