ES9 新特性之 Object.freeze 和 Object.seal 方法

在 JavaScript 的对象中,有时候需要限制对象的属性,使其不能被修改或删除。为此,ES9 新增了两个方法 Object.freeze()Object.seal(),可以帮助我们实现这种限制。

Object.freeze()

Object.freeze() 方法可以冻结对象,使其属性不能被修改、添加或删除。具体来说,它会将对象所有属性的 writable、configurable 属性都设置为 false。可以用下面的代码来演示:

----- --- - -
  ----- --------
  ---- --
--

-------------------

-------- - ------ -- ---------- --- ------

在上面的代码中,我们首先创建了一个对象 obj,然后使用 Object.freeze() 方法将其冻结。最后,我们试图修改 objname 属性,但是发现修改不生效。这是因为 obj 已经被冻结了,无法修改其属性。

需要注意的是,Object.freeze() 方法只能冻结对象的属性,不能冻结对象的属性值。也就是说,如果对象的属性值是一个对象,那么这个对象的属性还是可以被修改的。例如:

----- --- - -
  ----- --------
  ----- -
    ---- ---
    ------- --------
  -
--

-------------------

------------ - --- -- --------- -------- ------

在上面的代码中,我们创建了一个对象 obj,其中包含一个名为 info 的属性,其属性值是一个对象。然后使用 Object.freeze() 方法将 obj 冻结。接着,我们试图修改 obj.infoage 属性,发现修改生效了,这是因为 obj.info 并没有被冻结。

如果我们需要冻结对象的属性值,可以使用 Object.freeze() 方法递归地冻结对象的所有属性值。例如:

----- --- - -
  ----- --------
  ----- -
    ---- ---
    ------- --------
  -
--

-------- --------------- -
  -------------------
  -------------------------------- -- -
    -- ------- ----- --- --------- -
      ------------------
    -
  ---
-

----------------

------------ - --- -- ---------- --- - -------- -----

在上面的代码中,我们定义了一个名为 deepFreeze() 的函数,用来递归地冻结对象的所有属性值。然后使用 deepFreeze() 方法将 obj 冻结。最后,我们试图修改 obj.infoage 属性,发现修改不生效了。

Object.seal()

Object.seal() 方法可以封闭对象,使其属性不能被添加或删除,但是可以被修改。具体来说,它会将对象所有属性的 configurable 属性都设置为 false。可以用下面的代码来演示:

----- --- - -
  ----- --------
  ---- --
--

-----------------

-------- - ------ -- --------- --- --------------
---------- - --------- -- ---------- --- ------

在上面的代码中,我们首先创建了一个对象 obj,然后使用 Object.seal() 方法将其封闭。最后,我们试图修改 objname 属性和添加 gender 属性,发现修改生效了,但是添加不生效。这是因为 obj 只是被封闭了,而不是被冻结了,所以属性值可以被修改,但是属性不能被添加或删除。

需要注意的是,Object.seal() 方法同样不能封闭对象的属性值。如果需要封闭对象的属性值,可以使用 Object.seal() 方法递归地封闭对象的所有属性值。例如:

----- --- - -
  ----- --------
  ----- -
    ---- ---
    ------- --------
  -
--

-------- ------------- -
  -----------------
  -------------------------------- -- -
    -- ------- ----- --- --------- -
      ----------------
    -
  ---
-

--------------

------------ - --- -- --------- --- - -------- ---------------
---------- - ------- -- ---------- --- ------

在上面的代码中,我们定义了一个名为 deepSeal() 的函数,用来递归地封闭对象的所有属性值。然后使用 deepSeal() 方法将 obj 封闭。最后,我们试图修改 obj.infoage 属性和添加 gender 属性,发现修改生效了,但是添加不生效。这是因为 objobj.info 只是被封闭了,而不是被冻结了,所以属性值可以被修改,但是属性不能被添加或删除。

总结

ES9 新增的 Object.freeze()Object.seal() 方法可以帮助我们限制对象的属性,使其不能被修改或删除。需要注意的是,Object.freeze() 方法可以冻结对象的属性值,而 Object.seal() 方法不能封闭对象的属性值。如果需要冻结或封闭对象的属性值,可以使用递归函数来实现。这些方法可以在开发中帮助我们提高代码的可维护性和安全性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/662dc8b0d3423812e4b63676