美文网首页
ECMAScript6--18.Decorators修饰器

ECMAScript6--18.Decorators修饰器

作者: 飞菲fly | 来源:发表于2017-10-25 15:30 被阅读68次

    1.基本概念

    • 修饰器是一个函数用来修改类的行为;(扩展类的功能)
    • 修饰器只在类的范畴里有用,其他地方不能用;

    2.基本用法

    • 第三方库修饰器的js库:core-decorators

    • 可以通过npm install core-decorators安装,不用手动写修饰器函;
      import引进来直接@readonly就可以直接用了;

    • bable-polyfill打补丁打不到修饰器这个语法,需要额外安装一个插件
      bable-plugin-transform-decorator-legacy这么一个包;
      .bablerc 里面加一个插件:"plugin":["transform-decorator-legacy"]

      {
        //限制某个属性是只读的;
        //target:修改类本身;name:修改属性名称;descriptor:该属性的描述对象;
        let readonly =function(target,name,descriptor){
            //不允许修改,达到只读的效果;
            descriptor.writable = false;
            return descriptor;
        };
        
        class Test{
            //@后跟函数名称;和上面的函数名称要一致;否则找不到那个修饰器;
            //修饰器的作用;如果不加修饰器,可以重新赋值;
            //readonly把time变成了只读的;
            @readonly
            time(){
                return "2017-10-25"
            }
        }
        
        let test = new Test();
        //console.log(test.time()); //2017-10-25
        test.time = function(){
            console.log('reset time');
        };
        
        console.log(test.time()); 
        //cannot assign to read only property 'time' of object'#<Test>'
        //不允许只读属性重新赋值;
      }
      

    3.关于方法类里面可以,是不是可以在类外边操作呢?
    —可以,有一个前提,在class前面,其他地方都不可以;

    {
        let typename = function(target,name,descriptor){
           //在类上增加一个静态属性myname='hello';
            target.myname = 'hello';
        }
        
        @typename
        class Test{
            
        }
        
        console.log('类修饰符',Test.myname); //类修饰符 hello
    }
    

    4.日志系统,埋点

    • 好处:
      • 把埋点系统抽离出来,成为一个可复用的模块; 埋点接口变了,发送埋点通信方式变了,只需要改log对应的方法就可以了; 广告AD这个类几乎是不动的,保证了代码的可复用性;
      • 埋点系统从业务逻辑中拆离出去,业务代码简洁度、可维护性增强了不少;
    {
        let log =(type)=>{
            return function(target,name,descriptor){
                let src_method = descriptor.value;
                descriptor.value=(...arg)=>{
                    src_method.apply(target,arg);
                    //真实开发中换成埋点函数;语句new Img.src一个接口;
                    console.info(`log ${type}`);
                };
            }
        };
        
        class AD{
            @log('show')
            show(){
                console.info('ad is show'):
            }
            @log('click')
            click(){
                console.info('ad is click');
            }
        }
        
        let ad = new AD();
        ad.show();
        ad.click();
        //ad is show
        //log show
        //ad is click
        //log is click
    }

    相关文章

      网友评论

          本文标题:ECMAScript6--18.Decorators修饰器

          本文链接:https://www.haomeiwen.com/subject/xzvqpxtx.html