JavaScript防篡改对象

本文深入探讨了ECMAScript中防止对象被篡改的方法,包括不可扩展对象、密封对象和冻结对象,以及如何使用Object.preventExtensions()、Object.seal()和Object.freeze()方法来保护对象,防止代码意外修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任何人对象都可以被同一环境中运行的代码修改。开发人员很可能会意外地修改别人的代码,甚至用不兼容的功能重写原生的代码。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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值