ES9的新特性:Object.freeze()和Object.seal()方法

阅读时长 3 分钟读完

在JavaScript中,对象是一个非常重要的概念。ES6以前,我们无法轻易地冻结或限制其属性的更改。但现在,在ECMAScript 9(也称为ES2018)中,新引入了Object.freeze()和Object.seal()方法。

Object.freeze()

Object.freeze() 方法可以用于“冻结”一个对象,使其成为不可修改。当受到冻结的对象中属性的更改时,将会抛出错误或者静默地失败(如果执行JS严格模式时),也就是说,它的值不能被重新赋值,而对象本身及其属性也不能被删除。

这个特性非常有用,在需要防止意外修改对象时特别有用。例如:

在上面的例子中, myObj 成功被冻结,并尝试通过修改其属性 a 来改变对象时会抛出错误。 运行上述代码片段即可看到结果。

Object.seal()

另一种限制对象属性更改的方法是Object.seal(). 在执行 Object.seal() 后,对象将被密封并且其中的所有属性都将变为不可删除。与 Object.freeze() 不同的是,这里属性值可以被重写。

在上述例子中, myObj 被密封,意味着它的属性不能被删除。 我们试图删除其 a 属性,但失败并返回false. 然后我们覆盖了 a 的值,并成功更改了它的值。

应用场景

这些冻结和密封方法对于保护对象不受非法操作变得非常有用. 在ECMAScript6之前,我们只能通过 Object.defineProperty() 方法来实现一些保护措施,而这种方法相对较为复杂且容易出错。

下面是一个示例,在使用构造函数创建具有默认属性的对象时,每当用户尝试更改对象时,都会触发警告。

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

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

这个示例展示了如何在构造函数中使用 Object.freeze() 来创建不可更改的对象。当尝试重写其属性时将触发错误,无论是在严格模式下还是非严格模式下。

总结

Object.freeze()Object.seal() 是ES9引入的非常实用的特性,可以使我们轻松地“冻结”或“密封”对象,从而防止意外修改或删除操作。它们非常适用于需要保护对象的应用程序并减少错误的可能性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651bc99695b1f8cacd3679cd

纠错
反馈