在 JavaScript 中,对象是一个重要的概念,对象属性、对象方法、对象实例都在实际场景中得到了广泛的使用。但是,对于对象的管理和保护问题,必须引入一些机制就像 Object.freeze 和 Object.seal 这些 API,来限制对象的一些行为,增加代码的可靠性和安全性。
Object.freeze 和 Object.seal 的作用
Object.freeze 和 Object.seal 都是为了实现对于对象的保护机制,而将它们互相区别在于 freeze 保护机制的限制更高,即冻结对象,不能改变它的属性值、属性类型、枚举标记和对象结构,保证不会有任何变化。而 seal 会强制对象不可新增属性,仍然可以更改属性的值和枚举标记。
Object.freeze 的使用
首先,看一个例子:
-- -------------------- ---- ------- ---- -------- --- --- - - ----- - ----- ------ -- ------ --- -- -- -- ------------------- ------ ------------- - ------ ------------------ --------------------------- ------------------ --------------------- ----- ------ -------- ---- ----- -- --- ----------
在这个例子中,我们创建了一个对象,里面包含了一个对象 prop 和一个数组 count,然后通过 Object.freeze(obj)
冻结了整个对象。接着,我们修改了对象的属性 prop.name 的值,却没有得到期望的结果,而是依旧输出了原来的值。并且,当我们试图添加一个数组 count 的值时,会得到一个错误的提示:can't define property "4": array is not extensible,说明整个对象已经被完全冻结,任何变化都不会生效。
需要注意的是,如果对象自己有 changeMe 方法,这个方法自己就可以改变它的元素。为了让 freeze 保护变得有意义,可以使用对象的 proto 属性来禁用这个方法。
-- -------------------- ---- ------- ---- -------- --- --- - - ----- - ----- ------- --------- ---------- - --------- - ------ - -- ------ --- -- -- -- ------------------- ------ ---------------------- --------- -------------------- ------------------ --------------------------- ------------------ --------------------- ----- ------ -------- ---- ----- -- --- ----------
Object.seal 的使用
另外一个与 freeze 有区别的方法是 seal。这个方法为了保护对象不可新增属性,而仍然可以更改属性的值和枚举标记。看一个使用示例:
-- -------------------- ---- ------- ---- -------- --- --- - - ----- - ----- ------ -- ------ --- -- -- -- ----------------- ------------ ------------- - ------ --------------------- --------------------------- --------- - ------- ------------ ------ -------------- --------- ---------------------------------- ------
在这个示例中,我们使用了 Object.seal
方法来封住这个对象,接着,我们修改了对象 prop 的属性 name 的值,依旧输出了新的值,然后尝试添加了一个新属性 color,但是这是不可能的,因为该对象已被封住。接着我们尝试用 delete 关键字删除了对象的一个属性名,也是不可能的。在最后一个 console.log 方法中,判断对象是否被封住,返回 true,这表明对象不能被修改。
总结
Object.freeze 和 Object.seal 的区别在于 freeze 会将对象冻结、彻底禁止任何更改操作;而 seal 只是把对象封住,不允许新增属性,但是允许更改属性。
在实际开发中,使用这些 API 可以保证代码的可靠性和安全性,我们可以根据实际需求选择使用 freeze 或 seal 来有效保障对象的安全。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646ab7e1968c7c53b0a37297