Object函数的内置方法(19)Object.freeze

Object函数的内置方法(19)Object.freeze
最新回答
著墨染雨君画夕

2023-08-31 03:15:51

Object.freeze() 方法

答案

Object.freeze() 方法用于冻结一个对象。冻结后的对象将无法进行以下操作:

  • 不能添加新的属性。
  • 不能删除已有的属性。
  • 不能修改属性的值或可枚举性、可配置性。
  • 不能修改属性的写权限。

该方法会返回一个被冻结的对象,且该操作仅影响对象自身的属性,不影响从原型链上继承的属性。

详细解释

  1. 冻结对象

    使用 Object.freeze(obj) 可以将对象 obj 冻结。

    冻结后的对象,其所有自有属性(包括 Symbol 类型的属性)都将被设置为不可配置(configurable: false)和不可写(writable: false)。

  2. 不可扩展性

    冻结对象后,该对象将变为不可扩展(non-extensible),即不能添加新的属性。

    可以使用 Object.isExtensible(obj) 来检查对象是否可扩展,冻结后的对象将返回 false。

  3. 属性修改限制

    对于冻结对象的自有属性,任何尝试修改其值、可枚举性、可配置性或写权限的操作都会失败。

    如果尝试通过赋值操作修改属性值,该操作将静默失败(即不会报错,但属性值不会改变)。

    如果尝试使用 Object.defineProperty() 或 Object.defineProperties() 修改属性,将抛出 TypeError 异常。

  4. 对原型链上属性的影响

    冻结操作仅影响对象自身的属性,不影响从原型链上继承的属性。

    因此,如果对象从其原型链上继承了属性或方法,这些属性或方法仍然可以被访问和修改(如果它们是可写的)。

  5. 冻结数组对象

    当使用 Object.freeze() 冻结数组对象时,数组将变得不可扩展,且不能添加、删除或修改数组元素。

    尝试使用数组方法(如 push、pop、shift、unshift、splice 等)修改数组将失败,并可能抛出异常或静默失败(取决于具体方法)。

    尝试修改数组长度(length 属性)也将静默失败。

  6. 示例分析

    示例 1 展示了如何冻结一个包含普通属性和 Symbol 类型属性的对象,并展示了冻结前后属性描述符的变化。

    示例 2 展示了冻结对象后,尝试通过 setter 修改属性值将失败的情况。

    示例 3 展示了冻结数组对象后,尝试进行各种修改操作将失败的情况。

总结

Object.freeze() 方法提供了一种强大的方式来保护对象不被修改,适用于需要确保对象数据完整性和不可变性的场景。然而,需要注意的是,冻结操作仅影响对象自身的属性,不影响从原型链上继承的属性。