翻譯|使用教程|編輯:李爽夏|2019-01-03 10:05:29.000|閱讀 315 次
概述:本文介紹了如何在javascript中密封、凍結(jié)和防止對象擴(kuò)展。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
【下載Infragistics Ultimate最新版本】
在現(xiàn)代的JavaScript中,對象是不可分割的,對對象周圍的主題有很強(qiáng)的理解是編寫更好的JavaScript所必需的。您可以用JavaScript以四種方式創(chuàng)建對象。
一旦知道如何創(chuàng)建對象,您可能希望了解對象屬性描述符。綜上所述,假設(shè)您有一個(gè)對象——cat:
var cat = { name: 'foo', age: 9 }
每個(gè)對象屬性包含的信息不僅僅是一個(gè)值。例如,可以使用object.getownPropertyDescriptor方法打印其他屬性信息。
console.log(Object.getOwnPropertyDescriptor(cat, 'name'));
在控制臺上,可以看到屬性名提供了更多信息:
很明顯,如果將writable設(shè)置為true,則可以重寫屬性值等。您可以在此處閱讀有關(guān)javascript對象屬性描述符的更多信息。
到目前為止,您已經(jīng)了解了對象屬性描述符,因此如果需要將屬性設(shè)置為只讀,您將把該屬性設(shè)置為可寫。
Object.defineProperty(cat, 'name', { writable: false });
下一步,讓我們討論一下更改JavaScript對象默認(rèn)行為的更多要求。
防止對象具有新屬性
除要求1外,將所有可配置的屬性標(biāo)記為假
除了要求2之外,還應(yīng)使所有屬性都可寫為false
從ECMA 6開始,您有實(shí)現(xiàn)上述要求的方法。讓我們一個(gè)接一個(gè)地拿著:
Object.preventExtensions
比如說,你有一個(gè)對象——cat:
var cat = { name: 'foo', age: 9 }
使用默認(rèn)行為,您可以向JavaScript對象添加屬性。因此,可以進(jìn)行以下操作:
cat.color = 'black'; console.log(cat.color); // black
要防止默認(rèn)行為在對象中動態(tài)添加屬性,需要使用object.preventextensions()。此方法阻止對象添加新屬性。
Object.preventExtensions(cat); cat.color = 'black'; console.log(cat.color); // undefined
在對象上使用object.preventextensions之后,如果添加新的屬性顏色,javascript將忽略它,并且作為輸出,您將得到未定義的。
如果javascript處于嚴(yán)格模式,則如果向不可擴(kuò)展的對象添加新屬性,則會出現(xiàn)錯誤。
'use strict' var cat = { name: 'foo', age: 9 } Object.preventExtensions(cat); cat.color = 'black'; console.log(cat.color); // error thrown
在嚴(yán)格模式下,您將收到一個(gè)錯誤,消息傳遞非常清楚,即“cannot add property, object is not extensible”
總而言之,您應(yīng)該使用object.preventextensions方法來防止向?qū)ο筇砑有聦傩浴?/p>
假設(shè)你想封一個(gè)物體,意思是:
可以使用object.seal()方法密封對象。讓我們再次考慮一個(gè)對象——cat:
var cat = { name: 'foo', age: 9 }
您不希望將新屬性添加到cat中,并且所有屬性的可配置性都應(yīng)設(shè)置為false。可以使用object.seal()方法執(zhí)行此操作:
Object.seal(cat); cat.color = 'black'; console.log(cat.color); // undefined console.log(Object.getOwnPropertyDescriptor(cat, 'name'));
因?yàn)槟幸粋€(gè)密封的對象作為輸出,所以您將得到未定義和可配置的設(shè)置為false。
總而言之,應(yīng)該使用object.seal()來密封對象。您將無法添加新屬性,并且將配置設(shè)置為“false”。
假設(shè)你想凍結(jié)一個(gè)物體,意思是:
可以使用object.freeze()方法凍結(jié)對象。它本質(zhì)上調(diào)用object.seal()方法,并將可寫屬性設(shè)置為false。
讓我們考慮一個(gè)對象——cat:
var cat = { name: 'foo', age: 9 }
不應(yīng)將新屬性添加到對象中,所有屬性的可配置性應(yīng)設(shè)置為false,屬性的可寫性應(yīng)設(shè)置為false。可以使用object.freeze()方法執(zhí)行此操作:
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'));
由于您已經(jīng)凍結(jié)了對象,作為輸出,您將得到未定義、9和可配置和可寫設(shè)置為false。
總而言之,應(yīng)該使用object.freeze()凍結(jié)對象。一旦凍結(jié)對象,就不能添加新屬性或重寫屬性值,而configurable將設(shè)置為false。
在使用JavaScript中的對象時(shí),您需要對創(chuàng)建對象的不同方法有很強(qiáng)的理解。非常需要屬性描述符、object.seal、object.preventextensions和object.freeze。希望你現(xiàn)在能更好地理解這些概念。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn