JavaScript代理模式與new Proxy對象模擬實現(xiàn)prop-types值驗證

設(shè)計原則

代理與本體接口一致性

  • 用戶可以放心地使用代理,只需要關(guān)心能否得到想要的結(jié)果
  • 在任何使用本體的地方都可以替換成使用代理
  • 單一職責(zé) 與 開放-封閉原則

單一職責(zé)原則指的是,就一個類(通常也包括對象和函數(shù)等)而言,應(yīng)該僅有一個引起它變化的原因。如果一個對象承擔(dān)了多項職責(zé),就意味著這個對象將變得巨大,引起它變化的原因可能會有多個。面向?qū)ο笤O(shè)計鼓勵將行為分布到細粒度的對象之中,如果一個對象承擔(dān)的職責(zé)過多,等于把這些職責(zé)耦合到了一起,這種耦合會導(dǎo)致脆弱和低內(nèi)聚的設(shè)計。[1]

new Proxy模擬實現(xiàn)Prop-types

API設(shè)計

PropTypes.checkPropTypes(obj:Object[, proptypes])

Usage

let obj = {}
//add type props
obj.propTypes = {
  name : PropTypes.string,
  age : PropTypes.number
}

//subscribe
obj = PropTypes.checkPropTypes(obj)
//or 
obj = PropTypes.checkPropTypes(obj, {
  name: PropTypes.string,
  age : PropTypes.number
})

obj.name = 24; //throw Error
console.log(obj.name)  //undefined

實現(xiàn)

PropTypes對象[2]

    export const PropTypes = {
        checkPropTypes: function(){
            let obj = arguments[0],
                _propTypes = arguments[1];
            return new Proxy(obj, {
                set(target,key,val,proxy){
                    let _target = _propTypes||target.propTypes;
                    if(new RegExp(_target[key]['reg']).test(val)){
                        return Reflect.set(target,key,val,proxy)
                    }
                    return _target[key]['error'].call(this)
                }
            })
        },
        string:{
            reg:/^[\u4e00-\u9fa5]*$/,
            error:function(){
                throw new Error('不是字符串類型')
            }
        },
        number:{
            reg:/^[0-9]*$/,
            error:function(){
                throw new Error('不是數(shù)字類型')
            }
        },
    }

Reference

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容