在 JavaScript 的对象中,有时候需要限制对象的属性,使其不能被修改或删除。为此,ES9 新增了两个方法 Object.freeze()
和 Object.seal()
,可以帮助我们实现这种限制。
Object.freeze()
Object.freeze()
方法可以冻结对象,使其属性不能被修改、添加或删除。具体来说,它会将对象所有属性的 writable、configurable 属性都设置为 false。可以用下面的代码来演示:
const obj = { name: 'Alice', age: 20 }; Object.freeze(obj); obj.name = 'Bob'; // 这一行不会生效,因为 obj 已经被冻结了
在上面的代码中,我们首先创建了一个对象 obj
,然后使用 Object.freeze()
方法将其冻结。最后,我们试图修改 obj
的 name
属性,但是发现修改不生效。这是因为 obj
已经被冻结了,无法修改其属性。
需要注意的是,Object.freeze()
方法只能冻结对象的属性,不能冻结对象的属性值。也就是说,如果对象的属性值是一个对象,那么这个对象的属性还是可以被修改的。例如:
-- -------------------- ---- ------- ----- --- - - ----- -------- ----- - ---- --- ------- -------- - -- ------------------- ------------ - --- -- --------- -------- ------
在上面的代码中,我们创建了一个对象 obj
,其中包含一个名为 info
的属性,其属性值是一个对象。然后使用 Object.freeze()
方法将 obj
冻结。接着,我们试图修改 obj.info
的 age
属性,发现修改生效了,这是因为 obj.info
并没有被冻结。
如果我们需要冻结对象的属性值,可以使用 Object.freeze()
方法递归地冻结对象的所有属性值。例如:
-- -------------------- ---- ------- ----- --- - - ----- -------- ----- - ---- --- ------- -------- - -- -------- --------------- - ------------------- -------------------------------- -- - -- ------- ----- --- --------- - ------------------ - --- - ---------------- ------------ - --- -- ---------- --- - -------- -----
在上面的代码中,我们定义了一个名为 deepFreeze()
的函数,用来递归地冻结对象的所有属性值。然后使用 deepFreeze()
方法将 obj
冻结。最后,我们试图修改 obj.info
的 age
属性,发现修改不生效了。
Object.seal()
Object.seal()
方法可以封闭对象,使其属性不能被添加或删除,但是可以被修改。具体来说,它会将对象所有属性的 configurable 属性都设置为 false。可以用下面的代码来演示:
-- -------------------- ---- ------- ----- --- - - ----- -------- ---- -- -- ----------------- -------- - ------ -- --------- --- -------------- ---------- - --------- -- ---------- --- ------
在上面的代码中,我们首先创建了一个对象 obj
,然后使用 Object.seal()
方法将其封闭。最后,我们试图修改 obj
的 name
属性和添加 gender
属性,发现修改生效了,但是添加不生效。这是因为 obj
只是被封闭了,而不是被冻结了,所以属性值可以被修改,但是属性不能被添加或删除。
需要注意的是,Object.seal()
方法同样不能封闭对象的属性值。如果需要封闭对象的属性值,可以使用 Object.seal()
方法递归地封闭对象的所有属性值。例如:
-- -------------------- ---- ------- ----- --- - - ----- -------- ----- - ---- --- ------- -------- - -- -------- ------------- - ----------------- -------------------------------- -- - -- ------- ----- --- --------- - ---------------- - --- - -------------- ------------ - --- -- --------- --- - -------- --------------- ---------- - ------- -- ---------- --- ------
在上面的代码中,我们定义了一个名为 deepSeal()
的函数,用来递归地封闭对象的所有属性值。然后使用 deepSeal()
方法将 obj
封闭。最后,我们试图修改 obj.info
的 age
属性和添加 gender
属性,发现修改生效了,但是添加不生效。这是因为 obj
和 obj.info
只是被封闭了,而不是被冻结了,所以属性值可以被修改,但是属性不能被添加或删除。
总结
ES9 新增的 Object.freeze()
和 Object.seal()
方法可以帮助我们限制对象的属性,使其不能被修改或删除。需要注意的是,Object.freeze()
方法可以冻结对象的属性值,而 Object.seal()
方法不能封闭对象的属性值。如果需要冻结或封闭对象的属性值,可以使用递归函数来实现。这些方法可以在开发中帮助我们提高代码的可维护性和安全性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/662dc8b0d3423812e4b63676