ES6-修饰器

首先放一段示例代码

@testable
class MyTestableClass {

  // ...

}

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

MyTestableClass.isTestable // true

代码中@testable即为一个修饰器。可以看到,修饰器本质上是一个函数。将类作为修饰器函数的参数传入到函数内部,在函数内部为类挂载了属性与方法。

除了在类上使用修饰器外,还可以在类内部属性上使用修饰器。示例如下:

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

这个很好理解,表明Person类中的name属性是只读的。

那么readonly修饰器函数是怎样的呢?

function readonly(target, name, descriptor){

  // descriptor对象原来的值如下

  // {

  //   value: specifiedFunction,

  //   enumerable: false,

  //   configurable: true,

  //   writable: true

  // };

  descriptor.writable = false;

  return descriptor;

}

readonly(Person.prototype, 'name', descriptor);

当修饰器作用到类属性上时,实则将类原型作为对象传入到了修饰器函数内部,第二个参数即为作用的类属性名,第三个参数是该属性的一些默认属性。修改默认属性即可控制该类属性的一些行为(比如说是否可复写该方法等)。

修饰器的两种使用方法就是上面👆这些了。

注意,我们提到修饰器实则就是一个函数,所以,遇到React中的这种写法也就很好理解了

@connect(mapStateToProps, mapDispatchToProps)
function connect(mapStateToProps,mapDispatchToProps){
  return function(){}
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 3,162评论 2 9
  • 写在前面,因为function存在变量提升,所以修饰器是只能修饰类,而不能修饰函数 修饰器是一个函数,用来修改类的...
    ITtian阅读 1,943评论 0 3
  • decorator是ES7引入的功能,它是一个函数,用来修改类甚至于是方法的行为。 类的修饰 一个简单的栗子: @...
    youngss阅读 336评论 0 0
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,680评论 1 32
  • 修饰器@ 只能用于类 和 类的方法 类的修饰器 修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时 方法的...
    lmmy123阅读 1,533评论 0 0

友情链接更多精彩内容