es6 Proxy、Reflect的简易应用

2017-12-23  本文已影响0人  设置一个看起来合理的昵称
{
    function validation(target,validationExt){
        return new Proxy(target,{
            _validationExt:validationExt,
            set(target,key,value){
                // 验证是否存在key
                if(target.hasOwnProperty(key)){
                    let va = this._validationExt[key];// 验证value是否符合规则
                    if (!!va(value)) {
                        // 设置被代理对象属性
                        return Reflect.set(target,key,value);
                    }else{
                        throw Error(`不能设置${key}到${value}`);
                    }
                }else{
                    throw Error(`${key}不存在`);
                }
            },
        });
    }

    // 验证规则
    const validationExt = {
        name(val){
            return typeof val==='string'
        },
        age(val){
            return typeof val === 'number' && val>18
        },
    }
    
    class Person{
        constructor(name,age){
            this.name = name;
            this.age = age;
            return validation(this,validationExt);
        }
    }

    let person1 = new Person('wuding',30);
    console.log(person1);
    // 下面赋值报错
    // person1.name = 123;
    // person1.age = 17;
    // 下面赋值正常
    person1.name = 'Han';
    person1.age = 19;
    console.log(person1);
}
上一篇 下一篇

猜你喜欢

热点阅读