裝飾器這個概念夕春,很早就開始聽人說過,但是并沒有去深入了解過荧降。因為之前在使用mobx接箫,里面有大量的@使用,所以 這次來學習一下朵诫。
裝飾器模式- 是一種設計模式辛友,主要是對類或者類的屬性方法 在功能上進行擴展 不改變其原有的結構。
在js中decorator 就是對象進行包裝剪返,返回一個新的對象描述(descriptor)揍瑟。本質(zhì)其實就是一個函數(shù)十饥,分別接收三個參數(shù)蚀之,第一個是target每界,即要進行裝飾的類的原型,第二個參數(shù)是key钱反,即要進行裝飾的類或者方法屬性的名稱掖看,第三個是descriptor,即被裝飾的類或者方法屬性的descriptor面哥。當然哎壳,它也可以接收其他參數(shù),只是使用起來尚卫,方式略有不同归榕,但本質(zhì)還是一樣的。
Object.defineProperty(obj吱涉,prop刹泄,descriptor )
js中的decorator其實是一個語法糖外里,作用于對象的屬性時,實質(zhì)利用了Object.defineProperty方法特石。Object.defineProperty()?方法會直接在一個對象上定義一個新屬性级乐,或者修改一個對象的現(xiàn)有屬性, 并返回這個對象县匠。
descriptor-屬性描述符。對象里目前存在的屬性描述符有兩種主要形式:數(shù)據(jù)描述符和存取描述符撒轮。數(shù)據(jù)描述符是一個具有值的屬性乞旦,該值可能是可寫的,也可能不是可寫的题山。存取描述符是由 getter-setter 函數(shù)對描述的屬性兰粉。
get -- 一個給屬性提供 getter 的方法,如果沒有 getter 則為 undefined顶瞳。該方法返回值被用作屬性值玖姑。默認為 undefined。
set-- 一個給屬性提供 setter 的方法慨菱,如果沒有 setter 則為 undefined焰络。該方法將接受唯一參數(shù),并將該參數(shù)的新值分配給該屬性符喝。默認為 undefined闪彼。