关于es7的装饰器

从ES6起,JS有了类的定义和操作,ES7语法中增加了装饰器。文章先介绍Python装饰器示例,接着阐述ES7装饰器,它依赖ES5的Object.defineProperty方法,可用于类和类的方法的装饰,还指出装饰器不能用于函数,因为存在函数提升。

一,前言
       从ES6开始,js有了类的定义和操作(像class、extends),我们又希望在多个不同类之间共享或者扩展一些方法或行为,js参考了python,在ES7的语法中增加了装饰器
二,python的装饰器
    先来看一个python装饰器的例子,简单了解一下:

def decorator(f):
    print("这是一个装饰器")
    return f

@decorator
def myfunc():
    print("这是一个自定义的方法")

myfunc()

在这里插入图片描述
       我利用@decorator这个装饰器修饰了myfunc这个目标方法,运行结果是目标方法前又多打印了一句文本,而且并没有对原方法做任何修改
其实上面这段代码就相当于:

def decorator(f):
    print("这是一个装饰器")
    return f

def myfunc():
    print("这是一个自定义的方法")

myfunc2 = decorator(myfunc)
myfunc2()

三,ES7的装饰器
       es7中的装饰器也借鉴了@xxx类似的语法糖,它是依赖于ES5的Object.defineProperty 方法
用法:
1,类的装饰

@testable
class MyTestableClass {
  // ...
}

function testable(target) {
  target.isTestable = true;
}

MyTestableClass.isTestable // true

       可以看出,@testable 就是一个装饰器。它修改了 MyTestableClass这个类的行为,为它加上了静态属性isTestable。testable 函数的参数 target 是 MyTestableClass 类本身
        装饰器用来装饰类的时候。装饰器函数的第一个参数,就是所要装饰的目标类本身
        注意,装饰器对类的行为的改变,是代码编译时发生的,而不是在运行时。这意味着,装饰器能在编译阶段运行代码。也就是说,装饰器本质就是编译时执行的函数。
2,方法的修饰
        装饰器不仅可以装饰类,还可以装饰类的属性

class Person {
  @readonly
  name() { return `${this.first} ${this.last}` }
}

       示例中,装饰器函数 readonly 用来装饰“类”的name方法,并一共可以接受三个参数
装饰器(readonly)会修改属性的 描述对象(descriptor),然后被修改的描述对象再用来定义属性。

function readonly(target, name, descriptor){
  // descriptor对象原来的值如下
  // {
  //   value: specifiedFunction,
  //   enumerable: false,
  //   configurable: true,
  //   writable: true
  // };
  descriptor.writable = false;
  return descriptor;
}

readonly(Person.prototype, 'name', descriptor);
// 类似于
Object.defineProperty(Person.prototype, 'name', descriptor);

        装饰器第一个参数是类的原型对象,上例是 Person.prototype,装饰器的本意是要“装饰”类的实例,但是这个时候实例还没生成,所以只能去装饰原型(这不同于类的装饰,那种情况时target参数指的是类本身);
        第二个参数是 所要装饰的属性名
        第三个参数是 该属性的描述对象
四,关于函数方法的修饰
      首先,装饰器只能用于类和类的方法,不能用于函数,因为存在函数提升

function doSomething(name) {
  console.log('Hello, ' + name);
}

function loggingDecorator(wrapped) {
  return function() {
    console.log('Starting');
    wrapped.apply(this, arguments);
    console.log('Finished');
  }
}

const wrapped = loggingDecorator(doSomething);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值