在 JavaScript 中,有时候需要锁定一个对象,有三个方法可供选择:
-
Object.freeze
- 不能新增属性
- 不能修改属性
- 不能修改已有属性的可枚举性、可配置性、可写性
- 不能删除属性
-
Object.seal
- 不能新增属性
- 不能修改已有属性的可枚举性、可配置性、可写性
- 可以修改属性
- 不能删除属性
-
Object.preventExtensions
- 不能新增属性
可以用下面的方法判断是否被冻结、是否密封和是否可拓展:
Object.isFrozen(myObj)
Object.isSealed(myObj)
Object.isExtensible(myObj)
如果想要深度冻结一个对象,可以用 deep-freeze 包,提供了下面的函数:
function deepFreeze (o) {
Object.freeze(o)
Object.getOwnPropertyNames(o).forEach(function (prop) {
if (o.hasOwnProperty(prop)
&& o[prop] !== null
&& (typeof o[prop] === "object" || typeof o[prop] === "function")
&& !Object.isFrozen(o[prop])) {
deepFreeze(o[prop])