Decorators(修饰器)

定义
Decorator修饰器是一个函数用来修改类的行为:

  1. 修饰器是一个函数
  2. 修改行为
  3. 修改类的行为(修饰器只在类的范围类有用)
    在使用Decorators之前,需要使用命令行安装一个包,在命令行输入
npm install babel-plugin-transform-decorators-legacy --save-dev

然后在.babelrc文件中设置 “plugins”: [“transform-decorators-legacy”]

{
  "presets": ["env"],
  "plugins": ["transform-decorators-legacy"]
}

也可以使用第三方修饰器js库:

npm install core-decorators

语法:function(修改的类本身,修改的属性名称,该属性的描述对象)

let readonly = function(target,name,descriptor){
    descriptor.writable = false; 
    return descriptor;
  };

实例1:自定义一个修饰器

{
  //定义一个修饰器
  let readonly = function(target,name,descriptor){
    descriptor.writable = false;
    return descriptor;
  };
  
  class Text{
  //修改行为
    @readonly
    time() {
        return '2017-03-11'
      }
  }

  let test = new Text();
  //无法重新设置属性
  test.time = function(){
    console.log('reset time'); //不生效
  }

  console.log(test.time()); //2017-03-11
}

通过上面的代码,我们可以了解到Decorators修饰器的作用了,它本身是一个函数,可以在里面设置一些针对属性进行操作的外部行为,从而达到修改行为的效果。这是设置了time()属性不允许修改,所以console.log(‘reset time’)不生效.达到“只读”的功能。

实例2:在类外面进行操作(必须在class前面!)

{
  let typename = function(target,name,descriptor){
    target.myname = 'hello';
  }

  @typename
  class Test{

  }
  console.log('类修饰符',Test.myname);
  //打印结果
  //'修饰符' hello
  //第三方库 修饰器js库 core-decorators
}

当修饰器在类外面进行操作时可达到修改类行为的功能。

实例3:日志系统功能

{
  let log = (type) =>{
    return function(target,name,descriptor){
      let src_method = descriptor.value;
      descriptor.value = (...arg) =>{
        src_method.apply(target,arg);
        //埋点 如若后续业务变更,如接口变了直接在此修改,提高代码的复用性和可维护性
        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 is show
  // log show
  ad.click();
  //打印结果
  //ad is click
  //log click
}

运行报错:在这里插入图片描述
总结:Decorators修饰器是ES7的语法,上面的功能我们大概的可以知道它的作用就是修改行为,我自己在本地实践时发现使用Decorators会报错,如VSCode中"experimentalDecorators"设置问题,虽然通过首选项->设置->搜索experimentalDecorators参数为true,在VSCode编辑器中则不会提示报错,但在浏览器运行时还是报错了,问题请看上面的图,搞了一下午还是不行,目前还没有解决方法,有点伤心T.T,如果有大神解决了还望指点一二~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python decorators是一种用于修改或增强函数功能的语法结构。它们允许开发者在不修改原始函数代码的情况下,通过在函数定义之前使用特殊符号(@)和装饰函数来对函数进行包装或修饰。装饰函数接受被装饰函数作为参数,并可以在原始函数执行之前或之后添加额外的逻辑或功能。这种技术可以用来实现缓存、日志记录、身份验证等功能。 Python decorators的使用方法可以根据具体需求进行定义和实现。常见的方法包括使用装饰函数、使用类作为装饰、使用带参数的装饰等。装饰函数是最常见的一种方式,它接受一个函数作为参数并返回一个新的函数,新函数会替换原始函数。这样,在调用原始函数时,实际上是调用了被装饰的函数,从而在不修改原始函数的情况下添加了额外的功能。 除了使用Python内置的装饰语法,还可以使用第三方库来简化装饰的编写和使用。例如,可以使用decorator模块来定义和使用装饰。这个模块提供了一种更简洁的语法,可以直接在函数定义之前使用@decorator语法来应用装饰。该模块的使用方法如下所示: ```python from decorator import decorator @decorator def hint(func, *args, **kwargs): print('{} is running'.format(func.__name__)) return func(*args, **kwargs) ``` 上述代码定义了一个名为hint的装饰函数,它接受一个函数作为参数,并在函数执行之前打印出函数名。然后,通过在函数定义之前使用@hint语法,将装饰应用到目标函数上。这样,在调用目标函数时,实际上会先执行装饰函数内部的逻辑,然后再执行目标函数本身的逻辑。 总结来说,Python decorators是一种用于修饰函数的语法结构,可以通过装饰函数在不修改原始函数代码的情况下增强函数功能。它可以通过Python内置的装饰语法或第三方库来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python Decorator](https://blog.csdn.net/weixin_30951231/article/details/96490117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Python系列之装饰(decorator)](https://blog.csdn.net/ikxyang/article/details/121995824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值