
我在上圖中簡(jiǎn)單模擬了一處疑似重污染工廠的用水與排污系統(tǒng)模型,通過(guò)類比可視化幫助我理解JavaScript對(duì)象屬性的4個(gè)特性:
索取,代表工廠從大自然中索取潔凈水源,水表記錄了流過(guò)水流傳感器的用水量。
寫臟,代表工廠使用過(guò)的污水排入自然環(huán)境中,類似臟數(shù)據(jù)。
水表,只要水表正在運(yùn)行中,相關(guān)部門就能了解該工廠的用水情況。
總控,斷電后水表和排污開關(guān)皆停止運(yùn)行。
排污控制,其開關(guān)與否直接影響寫臟能否進(jìn)行。
回到JavaScript中,假設(shè)有對(duì)象factories,表示全部重污染工廠的集合:
varfactories = {}
一家名為sb-1的污染工廠進(jìn)入相關(guān)部門監(jiān)控范圍,于是在factories中加入新屬性:
Object.defineProperty(factories,'sb-1', {writable:true,enumerable:true,configurable:true})
writable:true在JavaScript中表示可寫性,圖中表示sb-1工廠的排污開關(guān)是打開狀態(tài);
enumerable:true在JavaScript中表示可枚舉性,圖中表示sb-1工廠的水表正常運(yùn)行中,等著相關(guān)部門來(lái)查水表;
configurable:true在JavaScript中表示可配置性,圖中表示sb-1工廠的總控臺(tái)是通電運(yùn)行狀態(tài)。
除了上面作為例子的1號(hào)污染工廠sb-1,還有2號(hào)、3號(hào)、4號(hào)等等都在相關(guān)部門監(jiān)管范圍內(nèi)。相關(guān)部門開始查水表,只需遍歷factories,如果檢測(cè)到屬性值為"污水"觸發(fā)警報(bào):
for(letfactoryinfactories){console.log(`即將查工廠“${factory}`”的水表)// 即將查工廠“sb-1”的水表check(factories[factory])// 嘟嘟嘟!污水!限期整改!}
查水表的前提條件是:工廠的水表必須是正在運(yùn)行中。
sb-1工廠向環(huán)境中排放未過(guò)濾污水,為了繞過(guò)審查,將工廠水表關(guān)掉了:
Object.defineProperty(factories,'sb-1', {value:"污水"enumerable:false,})
這樣一來(lái),相關(guān)部門再次遍歷factories中的所有工廠,不在審查工廠sb-1,廠長(zhǎng)得意地笑了,小聰明也。
相關(guān)部門也不是吃素的,立即采取措施,審查組到污染工廠將排污閥門關(guān)閉,整改1個(gè)月:
Object.defineProperty(factories,'sb-1', {writable:false})
這下,sb-1工廠一個(gè)月不能再寫臟了,廠長(zhǎng)有小聰明吖,偷偷把排污閥門又打開了:
Object.defineProperty(factories,'sb-1', {writable:true})
這一次相關(guān)部門被惹怒,沒(méi)手軟,果斷出手整治,污染工廠直接歇菜:
Object.defineProperty(factories,'sb-1', {enumerable:false,writable:false,configurable:false})
水表關(guān)閉;排污閥門關(guān)閉。總控臺(tái)一旦被斷電,重污染工廠關(guān)門大吉。
相關(guān)部門要批量關(guān)閉多個(gè)污染工廠,會(huì)這樣做:
Object.defineProperties(factories, {'sb-1':{configurable: flase},'sb-2':{configurable: flase},'sb-3':{configurable: flase}})
另外,getter和setter也屬于屬性特性,它們是函數(shù):
Object.defineProperty(factories,'sb-1', {get:function(){return'污水'},set:function(){},writable:false,configurable:false})
如果工廠將getter函數(shù)的算法設(shè)計(jì)為:
當(dāng)水源被檢測(cè)時(shí)返回(排出)"凈水",當(dāng)未被檢測(cè)時(shí)返回(排出)"污水",emmmm???
檢測(cè)對(duì)象屬性特性可以使用Object.getOwnPropertyDescriptor(),第一個(gè)參數(shù)傳入對(duì)象,第二個(gè)參數(shù)傳入要查詢的屬性名:
Object.getOwnPropertyDescriptor(factories,"sb-1")
現(xiàn)實(shí)世界里,工廠正將污水肆無(wú)忌憚地排入河里;
虛擬世界里,噴子和鍵盤俠們正在網(wǎng)絡(luò)里捍衛(wèi)“正義”。
原創(chuàng)作者:帥華君
原文鏈接:http://www.shuaihuajun.com/article/javascript-object-property-attribute/