了解 Object.freeze 和 Object.seal 的区别

阅读时长 4 分钟读完

在 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

纠错
反馈