在JavaScript中,对象是一个非常重要的概念。ES6以前,我们无法轻易地冻结或限制其属性的更改。但现在,在ECMAScript 9(也称为ES2018)中,新引入了Object.freeze()和Object.seal()方法。
Object.freeze()
Object.freeze()
方法可以用于“冻结”一个对象,使其成为不可修改。当受到冻结的对象中属性的更改时,将会抛出错误或者静默地失败(如果执行JS严格模式时),也就是说,它的值不能被重新赋值,而对象本身及其属性也不能被删除。
这个特性非常有用,在需要防止意外修改对象时特别有用。例如:
const myObj = { a: 1, b: 2 }; Object.freeze(myObj); myObj.a = 3; // throws an error in strict mode console.log(myObj); // { a: 1, b: 2 }
在上面的例子中, myObj
成功被冻结,并尝试通过修改其属性 a
来改变对象时会抛出错误。 运行上述代码片段即可看到结果。
Object.seal()
另一种限制对象属性更改的方法是Object.seal()
. 在执行 Object.seal()
后,对象将被密封并且其中的所有属性都将变为不可删除。与 Object.freeze()
不同的是,这里属性值可以被重写。
const myObj = { a: 1, b: 2 }; Object.seal(myObj); delete myObj.a; // returns false myObj.a = 3; // the value of 'a' is updated console.log(myObj); // { a: 3, b: 2 }
在上述例子中, myObj
被密封,意味着它的属性不能被删除。 我们试图删除其 a
属性,但失败并返回false
. 然后我们覆盖了 a
的值,并成功更改了它的值。
应用场景
这些冻结和密封方法对于保护对象不受非法操作变得非常有用. 在ECMAScript6之前,我们只能通过 Object.defineProperty()
方法来实现一些保护措施,而这种方法相对较为复杂且容易出错。
下面是一个示例,在使用构造函数创建具有默认属性的对象时,每当用户尝试更改对象时,都会触发警告。
-- -------------------- ---- ------- -------- ------------ ---- - --------- - ----- -------- - ---- -------------------- - ----- ---- - --- -------------- ---- --------- - ------ -- ------ -- ----- -- ------ ---- ------------------ -- ------ ------- ---- ---
这个示例展示了如何在构造函数中使用 Object.freeze()
来创建不可更改的对象。当尝试重写其属性时将触发错误,无论是在严格模式下还是非严格模式下。
总结
Object.freeze()
和 Object.seal()
是ES9引入的非常实用的特性,可以使我们轻松地“冻结”或“密封”对象,从而防止意外修改或删除操作。它们非常适用于需要保护对象的应用程序并减少错误的可能性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651bc99695b1f8cacd3679cd