类装饰

  1. @add
  2. class My {
  3. }
  4. function add(target) { // 修饰类的时候 target指代的就是类
  5. target.flag = 'ok'
  6. }
  7. console.log(My.flag) // ok

属性装饰

  1. class Circle {
  2. @readonly PI = 3.14 // 不可修改
  3. }
  4. function readonly(target,key,descriptor) {
  5. // target:类的原型 key:PI descriptor:描述器
  6. descriptor.writable = false;
  7. return descriptor //必须返回一个描述对象
  8. }
  9. let c = new Circle();
  10. c.PI = 100 //会报错

原型的上的方法的装饰器

  1. class Person{
  2. @say
  3. say(){
  4. console.log('哈哈')
  5. }
  6. }
  7. function say(target,key,descriptor) {
  8. let oldSay = descriptor.value
  9. descriptor.value = function () { //修改方法
  10. console.log('start say');
  11. oldSay(); //调用旧方法
  12. console.log('end say');
  13. }
  14. }
  15. let p = new Person;
  16. p.say();

淘宝FED:ES7 Decorator 装饰者模式