繼續(xù)分享在 javascript 中是如何實現(xiàn)元編程,我們先介紹一下在 js 中的代理以及代理模式是什么,Proxy 從名字上看顯而易見,就是對真實對象進行代理,為了是隱藏真實對象,且提供統(tǒng)一接口。大家記住這個就行,以后在設(shè)計模式中會為大家詳細講解,在元編程中的代理的目的是—提供統(tǒng)一接口。
第一參數(shù)為要代理的對象,通過 new 創(chuàng)建的 proxy 對象是代理什么對象或類型,可以代理以下類型的對象,提醒他們都是 object 類型。
代理創(chuàng)建對象與其代理對象類型保持一致。
這里處理函數(shù),其實就是復(fù)寫一些對象一些基本方法,代理也就是在原有對象上再套上一層,為其原有的方法添加新特性。
有關(guān) handler(處理方法)是通過代碼給大家解釋一下,我們通過 hanlder 復(fù)寫對象原有的 get 方法,如果屬性在對象中不存,我們在獲取時就會返回 37 ,代碼很簡單也很明了,就不進行過多解釋了,也便于大家理解 handler 的用途。
這是代理可以復(fù)寫的方法,在元編程中的代理一般不單獨使用,他會與下面介紹的 Reflect 對象一起共同完成對元編程的實現(xiàn)。所以他們倆的方法也是一一對應(yīng)的。因為代理一個對象后,我們復(fù)寫了原有方法,還需要用 Reflect 來調(diào)用原有的方法。
介紹 Reflect API?
Reflect 不是構(gòu)造函數(shù), 要使用的時候,直接通過 Reflect.method() 來調(diào)用, Reflect 有的方法和 Proxy 差不多, 而且多數(shù) Reflect 方法原生的 Object 已經(jīng)重新實現(xiàn)了。
*這里給大家提一下 revoke 方法,如果執(zhí)行這個 revoke 方法就會銷毀對象屬性。
實戰(zhàn)以動態(tài)校驗為例來進行講解。
來看一看,動態(tài)校驗是如何實現(xiàn)的,在運行時當(dāng)我們?yōu)閷ο筚x值時,進行動態(tài)地校驗,代碼很清晰,估計大家一看就明白邏輯,這也就是會說話的代碼。
這里如果有傳入 validations 回調(diào)函數(shù),就使用傳入的回調(diào)函數(shù),如果沒有就用默認 ()=>true。validations 是一個校驗對象,根據(jù)傳入 key 來調(diào)用對應(yīng)的校驗方法。