跳至正文
首页 » 博客 » How to Seal, Freeze, and Prevent Extension of an Object in JavaScript

How to Seal, Freeze, and Prevent Extension of an Object in JavaScript

在现代JavaScript中,对象是不可或缺的,对围绕对象的主题有深入的了解对于编写更好的JavaScript是必要的。在JavaScript中,您可以通过四种方式创建对象。

阅读更详细的在这里

一旦你知道如何创建一个对象,你可能希望了解对象属性描述符。作为一个回顾,让我们说你有一个对象猫:

var cat = {名称: 'foo'年龄: 9}

每个对象属性包含的信息不仅仅是一个值。例如,可以使用Object.getOwnPropertyDescriptor方法打印其他属性信息

console.log(Object.getOwnPropertyDescriptor(cat, 'name' ));

在控制台上,您可以看到属性名称提供了更多信息:

很清楚,如果writable设置为true,则可以重写属性值等。你可以阅读更多关于JavaScript对象属性描述符此处

到目前为止,您已经了解了对象属性描述符,因此,如果需要将属性设置为只读, 则可以将该属性设置为可写false

Object.de fineProperty(cat, 'name', { writable: false });

接下来,让我们再了解一些更改JavaScript对象默认行为的要求。

  1. 防止对象具有新属性
  2. 除要求1外,将所有属性标记为可配置为false
  3. 除了要求2,使所有属性可写为false

从ECMA 6开始,你有方法来实现上述要求。让我们逐一介绍一下:

Object.preventExtensions

让我们说,你有一个对象猫:

var cat = {名称: 'foo'年龄: 9} 

使用默认行为,您可以向JavaScript对象添加属性。因此,下面的操作是可能的:

cat.color = “ 黑色 ”;console.log(cat.color); // 黑色

为了防止默认行为在对象中动态添加属性,您需要使用object.preventExtensions() 此方法可防止对象添加新属性。

Object.preventExtensions(cat);cat.color = “ 黑色”;console.log(cat.color) // 未定义 

在对象上使用Object.preventExtensions后,如果添加新的属性颜色,JavaScript将忽略它,并且作为输出,您将获得undefined

如果JavaScript处于严格模式, 则在向不可扩展的对象添加新属性时会出现错误。

“使用严格”

var cat = { 名称: 'foo'年龄: 9} Object.preventExtensions(cat);cat.color = “ 黑色”;console.log(cat.color) // 抛出

错误

在严格模式下,你会得到一个错误,非常清晰的消息,指出,“不能添加属性,对象是不可扩展的”

总之,您应该使用object.preventExtensions防止对象添加新属性的方法。

Object.seal

让我们说你想密封一个物体,意思是:

  • 您应该无法添加新属性 (调用object.preventExtensions())
  • 没有配置应更改 (设置可配置属性为false)

您可以使用object.seal() 方法密封对象。让我们再次考虑一个对象-猫:

var cat = { 名称: 'foo'年龄: 9} 

您不希望将新属性添加到cat中,并且所有属性的可配置属性都应设置为false。您可以使用object.seal() 方法:

对象.seal(cat);cat.color = “ 黑色”;console.log(cat.color); //未定义console.log(Object.getOwnPropertyDescriptor(cat, 'name' )); 

由于您有一个密封的对象,作为输出,您将获得未定义和可配置的设置为false。

总结一下,你应该使用Object.seal() 来密封一个对象。您将无法添加新属性,并且可配置设置为false。

对象.冻结

让我们说你想冻结一个对象,意思是:

  • 您应该无法添加新属性,这意味着调用object.preventExtensions()
  • 没有配置应更改 (设置可配置的属性为false)
  • 对于所有属性,writable应设置为false

可以使用object.freeze() 方法冻结对象。它本质上调用Object.seal() 方法,并将writable属性设置为false。

让我们考虑一个对象-猫:

var cat = {名称: 'foo'年龄: 9}

新属性不应添加到对象中,所有属性的可配置应设置为false,属性的可写应设置为false。您可以使用object.freeze() 方法:

对象冻结 (cat);猫年龄 = 10;cat.color = “ 黑色”;console.log(cat.age); // 9console.log(cat.color); // 未定义console.log(Object.getOwnPropertyDescriptor(cat, 'name' )); 

由于您已经冻结了对象,作为输出,您将获得未定义,9和可配置和可写设置为false。

总之,你应该使用Object.freeze() 冻结对象。冻结对象后,您将无法添加新属性或重写属性的值,并且configurable将设置为false。

摘要

在JavaScript中使用对象时,您需要对创建对象的不同方式有深刻的理解。非常需要属性描述符、Object.seal、Object.preventExtensions和Object.freeze。我希望您现在对这些概念有了更好的掌握。</p