在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,群內不定期分享乾貨,進群就可領取基礎教學視訊,歡迎各位加入