//修饰器是一个t函数,用来修改类的行为,修饰器对类的行为的改变是代码编译时发生,而不是执行时
// 修饰器能在编译阶段运行代码
//参数target就是所要修饰的类
function testTable(target) {
  target.isTestable = ture;
}

@testtable
class MyTesttableClass {}

// 如果一个参数不够用,可以在修饰器外面在封装一层函数
function testtable(isTestable) {
  return function(target) {
    target.isTestable = isTestable;
  }
}

@testTable(true)
class MyTesttableClass {}
MyTesttableClass.isTestable // true

// 上面的例子是为类添加一个静态属性,如果想添加实列属性,可以通过目标类的prototype对象操作
// 因为类的属性和方法都是在prototype上
function testable(target) {
  target.prototype.isTestable = true
}
@testTable
class MyTesttableClass {}

const obj = new MyTesttableClass(); // 创建一个MyTesttableClass实例
obj.isTestable // true

// 上面例子是通过修饰器,把isTestables属性加到MyTesttableClass类的实例上面,可以用Object.assign()来模拟这个功能
const foo = {
  isTestable: true
}
class MyTesttableClass {}
Object.assign(MyTesttableClass.prototype, foo);
const obj = new MyTesttableClass();
obj.isTestable // true

备注:修饰器不仅可以修饰类,还可以修饰类的属性,注意一点,修饰器只用于修饰类和类的方法,不可以用于函数,因为函数存在函数提升。

01-21 10:27