ES6-ES7 Decorator基础应用

11 篇文章 0 订阅

1.安装编译Decorator所需要的依赖项

在这里插入图片描述

2.npx babel 当前需要编译文件 -o 编译后的文件

浏览器无法识别es7的语言,需要通过babel工具辅助编译,业务需求使用编译后的文件

3.Decorator代码实例演示如下代码

class Decoration {
      constructor() {
        this.keyValue = "";
      }
      @statement //装饰器命名
      url = "aaa"; //被装饰的属性
      agent() {
        console.log(this.url + "----------" + this.keyValue);
      }
    }

    function statement(proto, key, descriptor) {
    
      console.log(proto, key, descriptor);
      descriptor.writable = false; //被装饰属性不可写
      
    }

    var os = new Decoration();
  • 私有属性 console.log(proto,key,descriptor) 结果如下所示

4.装饰私有 属性修改值

function statement(proto, key, descriptor) {

	  descriptor.writable = false
      console.log( descriptor.initializer() ) //被装饰的属性值;装饰私有属性特有的一个属性
      
      descriptor.initializer = function() {
          return 'url的值被修改了'
      }
    }

5.装饰原型属性

class Decoration {
      constructor() {
        this.keyValue = "";
      }
      @pro //装饰原型属性
      agent() {
        console.log(this.url + "----------" + this.keyValue);
      }
    }
    
    function pro(proto, key, descriptor){
        console.log(proto, key, descriptor)//打印结果如下图; 
        let oldValue = descriptor.value //被装饰的函数
         descriptor.value = function(){
             console.log('被装饰的函数重写')
         }
    }
    
    var os = new Decoration();
    	os.agent()
  • 原型属性 console.log(proto, key, descriptor) 打印结果如下图
  • 装饰原型属性 descriptor 对象上多了value属性,没有initializer属性
  • 个人理解是区别装饰私有属性和原型属性的区别特性之一
  • 装饰箭头函数时,会被认为是在装饰私有属性,这点要多加留意,稍不慎就掉坑

6.装饰器代理思想模拟

class Decoration {
      constructor() {
        this.keyValue = "";
      }
      @pro //装饰原型属性
      agent() {
        console.log(this.url + "----------" + this.keyValue);
        return  '返回值+520'
      }
    }
    
   function pro(proto, key, descriptor){
        console.log(proto, key, descriptor)
        let oldValue = descriptor.value //被装饰的函数
         descriptor.value = function(){
             var urlB = 'bbb'
             console.log(urlB + '---------' + this.keyValue)
             return oldValue.apply(this,arguments) // 不要忘记return;不然返回值是undefind
         }
    }
    
    var os = new Decoration();
    var result = os.agent()
    console.lo(result)//打印结果是 '返回值+520'

7.类函数装饰器

		@skin
		class Decoration {
		      constructor() {
		        this.keyValue = "";
		      }
		}
		function skin(traget){
			traget.age = '18' //添加一个属性age并赋值18
		}

8.装饰器最后总结

在原有的基础函数上,不扰乱原先的代码,拓展一些额外的功能函数,从而达到装饰的作用!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值