繼續(xù)分享在 javascript 中是如何實(shí)現(xiàn)元編程,我們先介紹一下在 js 中的代理以及代理模式是什么特笋,Proxy 從名字上看顯而易見克锣,就是對(duì)真實(shí)對(duì)象進(jìn)行代理,為了是隱藏真實(shí)對(duì)象诉儒,且提供統(tǒng)一接口。大家記住這個(gè)就行亏掀,以后在設(shè)計(jì)模式中會(huì)為大家詳細(xì)講解忱反,在元編程中的代理的目的是—提供統(tǒng)一接口。
第一參數(shù)為要代理的對(duì)象滤愕,通過(guò) new 創(chuàng)建的 proxy 對(duì)象是代理什么對(duì)象或類型温算,可以代理以下類型的對(duì)象,提醒他們都是 object 類型间影。
代理創(chuàng)建對(duì)象與其代理對(duì)象類型保持一致注竿。
這里處理函數(shù),其實(shí)就是復(fù)寫一些對(duì)象一些基本方法魂贬,代理也就是在原有對(duì)象上再套上一層巩割,為其原有的方法添加新特性。
有關(guān) handler(處理方法)是通過(guò)代碼給大家解釋一下付燥,我們通過(guò) hanlder 復(fù)寫對(duì)象原有的 get 方法宣谈,如果屬性在對(duì)象中不存,我們?cè)讷@取時(shí)就會(huì)返回 37 机蔗,代碼很簡(jiǎn)單也很明了蒲祈,就不進(jìn)行過(guò)多解釋了,也便于大家理解 handler 的用途萝嘁。
這是代理可以復(fù)寫的方法梆掸,在元編程中的代理一般不單獨(dú)使用,他會(huì)與下面介紹的 Reflect 對(duì)象一起共同完成對(duì)元編程的實(shí)現(xiàn)牙言。所以他們倆的方法也是一一對(duì)應(yīng)的酸钦。因?yàn)榇硪粋€(gè)對(duì)象后,我們復(fù)寫了原有方法咱枉,還需要用 Reflect 來(lái)調(diào)用原有的方法卑硫。
介紹 Reflect API?
Reflect 不是構(gòu)造函數(shù)徒恋, 要使用的時(shí)候,直接通過(guò) Reflect.method() 來(lái)調(diào)用欢伏, Reflect 有的方法和 Proxy 差不多入挣, 而且多數(shù) Reflect 方法原生的 Object 已經(jīng)重新實(shí)現(xiàn)了。
*這里給大家提一下 revoke 方法硝拧,如果執(zhí)行這個(gè) revoke 方法就會(huì)銷毀對(duì)象屬性径筏。
實(shí)戰(zhàn)以動(dòng)態(tài)校驗(yàn)為例來(lái)進(jìn)行講解。
來(lái)看一看障陶,動(dòng)態(tài)校驗(yàn)是如何實(shí)現(xiàn)的滋恬,在運(yùn)行時(shí)當(dāng)我們?yōu)閷?duì)象賦值時(shí),進(jìn)行動(dòng)態(tài)地校驗(yàn)抱究,代碼很清晰恢氯,估計(jì)大家一看就明白邏輯,這也就是會(huì)說(shuō)話的代碼鼓寺。
這里如果有傳入 validations 回調(diào)函數(shù)勋拟,就使用傳入的回調(diào)函數(shù),如果沒有就用默認(rèn) ()=>true侄刽。validations 是一個(gè)校驗(yàn)對(duì)象指黎,根據(jù)傳入 key 來(lái)調(diào)用對(duì)應(yīng)的校驗(yàn)方法朋凉。