在日常的前端开发中,我们经常需要处理对象的数据,但是对象的属性值往往是可以被修改的,这会带来很多安全隐患。为了解决这个问题,ECMAScript 2017 引入了 Object.seal 和 Object.freeze 方法,它们可以让对象更加安全。
Object.seal
Object.seal 方法可以将一个对象密封(seal),密封后的对象不能添加新属性,不能删除已有属性,也不能修改已有属性的可枚举性、可配置性和可写性。但是已有属性的值是可以修改的。
下面是一个使用 Object.seal 方法的示例代码:
const person = { name: 'Tom', age: 18 }; Object.seal(person); person.name = 'Jerry'; // 可以修改 person.gender = 'male'; // 不能添加新属性 delete person.age; // 不能删除已有属性 Object.defineProperty(person, 'name', { writable: false }); // 不能修改已有属性的可写性
Object.freeze
Object.freeze 方法可以将一个对象冻结(freeze),冻结后的对象不能添加新属性,不能删除已有属性,也不能修改已有属性的可枚举性、可配置性和可写性。已有属性的值也不能修改。
下面是一个使用 Object.freeze 方法的示例代码:
const person = { name: 'Tom', age: 18 }; Object.freeze(person); person.name = 'Jerry'; // 不能修改已有属性的值 person.gender = 'male'; // 不能添加新属性 delete person.age; // 不能删除已有属性 Object.defineProperty(person, 'name', { writable: false }); // 不能修改已有属性的可写性
应用场景
Object.seal 和 Object.freeze 方法在实际开发中有很多应用场景,比如:
- 禁止对某些敏感数据进行修改,如用户的密码、身份证号等。
- 防止程序中的某些对象被误修改,从而导致程序出错。
- 对于一些不需要修改的配置信息,可以使用 Object.freeze 方法来保护其不被修改。
总结
Object.seal 和 Object.freeze 方法可以让对象更加安全,避免因为对象的属性值被修改而导致的安全隐患。但是需要注意,这些方法只能保护对象本身,不能保护对象属性的引用类型数据。如果对象属性是引用类型数据,需要对其进行深度冻结或者深度密封才能达到完全保护的效果。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658d8330eb4cecbf2d377ba9