1. 程式人生 > >在javascript中密封、凍結和防止物件擴充套件

在javascript中密封、凍結和防止物件擴充套件

在現代的JavaScript中,物件是不可分割的,對物件周圍的主題有很強的理解是編寫更好的JavaScript所必需的。您可以用JavaScript以四種方式建立物件。

一旦知道如何建立物件,您可能希望瞭解物件屬性描述符。綜上所述,假設您有一個物件——cat:

var cat = {

    name: 'foo',

    age: 9

}

每個物件屬性包含的資訊不僅僅是一個值。例如,可以使用object.getownPropertyDescriptor方法列印其他屬性資訊。

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

在控制檯上,可以看到屬性名提供了更多資訊:

infragistics

很明顯,如果將writable設定為true,則可以重寫屬性值等。您可以在此處閱讀有關javascript物件屬性描述符的更多資訊。

到目前為止,您已經瞭解了物件屬性描述符,因此如果需要將屬性設定為只讀,您將把該屬性設定為可寫。

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

想學習Web前端或需要Web學習資料的,在這推薦下我自己的Web學習群:585843909,群內不定期分享乾貨,進群就可領取基礎教學視訊,歡迎各位加入

下一步,讓我們討論一下更改JavaScript物件預設行為的更多要求。

防止物件具有新屬性

除要求1外,將所有可配置的屬性標記為假

除了要求2之外,還應使所有屬性都可寫為false

從ECMA 6開始,您有實現上述要求的方法。讓我們一個接一個地拿著:

Object.preventExtensions

比如說,你有一個物件——cat:
var cat = {

    name: 'foo',

    age: 9

}

使用預設行為,您可以向JavaScript物件新增屬性。因此,可以進行以下操作:

cat.color = 'black';

console.log(cat.color); // black

要防止預設行為在物件中動態新增屬性,需要使用object.preventextensions()。此方法阻止物件新增新屬性。

Object.preventExtensions(cat);

cat.color = 'black';

console.log(cat.color); // undefined

在物件上使用object.preventextensions之後,如果新增新的屬性顏色,javascript將忽略它,並且作為輸出,您將得到未定義的。

如果javascript處於嚴格模式,則如果向不可擴充套件的物件新增新屬性,則會出現錯誤。
‘use strict’

var cat = {

  

    name: 'foo',

    age: 9

}

  

Object.preventExtensions(cat);

cat.color = 'black';

console.log(cat.color); // error thrown

在嚴格模式下,您將收到一個錯誤,訊息傳遞非常清楚,即“cannot add property, object is not extensible”

infragistics

總而言之,您應該使用object.preventextensions方法來防止向物件新增新屬性。

Object.seal

假設你想封一個物體,意思是:

您應該無法新增新屬性(呼叫object.preventextensions())
不應更改任何配置(將可配置屬性設定為false)
可以使用object.seal()方法密封物件。讓我們再次考慮一個物件——cat:

var cat = {

  

    name: 'foo',

    age: 9

}

您不希望將新屬性新增到cat中,並且所有屬性的可配置性都應設定為false。可以使用object.seal()方法執行此操作:

Object.seal(cat);

cat.color = 'black';

console.log(cat.color); // undefined

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

因為您有一個密封的物件作為輸出,所以您將得到未定義和可配置的設定為false。

infragistics

總而言之,應該使用object.seal()來密封物件。您將無法新增新屬性,並且將配置設定為“false”。

Object.freeze

假設你想凍結一個物體,意思是:

您應該無法新增新的屬性,這意味著呼叫object.preventextensions()。
不應更改任何配置(將屬性的configurable設定為false)
對於所有屬性,writable應設定為false。
可以使用object.freeze()方法凍結物件。它本質上呼叫object.seal()方法,並將可寫屬性設定為false。

讓我們考慮一個物件——cat:

var cat = {

    name: 'foo',

    age: 9

}

不應將新屬性新增到物件中,所有屬性的可配置性應設定為false,屬性的可寫性應設定為false。可以使用object.freeze()方法執行此操作:

Object.freeze(cat);

cat.age = 10;

cat.color = 'black';

console.log(cat.age); //9

console.log(cat.color); // undefined

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

由於您已經凍結了物件,作為輸出,您將得到未定義、9和可配置和可寫設定為false。

infragistics

總而言之,應該使用object.freeze()凍結物件。一旦凍結物件,就不能新增新屬性或重寫屬性值,而configurable將設定為false。

總結

在使用JavaScript中的物件時,您需要對建立物件的不同方法有很強的理解。非常需要屬性描述符、object.seal、object.preventextensions和object.freeze。希望你現在能更好地理解這些概念。

想學習Web前端或需要Web學習資料的,在這推薦下我自己的Web學習群:585843909,群內不定期分享乾貨,進群就可領取基礎教學視訊,歡迎各位加入

原文地址