1.装饰器的基本使用

  1. //装饰器就是修饰类的一个函数
  2. //添加类的静态成员
  3. function fn(target){
  4. target.foo='bar'
  5. }
  6. @fn
  7. class Myclass{}
  8. console.log(Myclass.foo);
  9. //带参数的装饰器
  10. @fn2(10)
  11. class Mycfass{}
  12. function fn2(value){
  13. return function(target){
  14. target.count=value
  15. }
  16. }
  17. console.log(Mycfass.count);
  18. );
  1. //在装饰器的实例上添加实例成员
  2. @fn3
  3. class Mycgass{}
  4. function fn3(target){
  5. target.prototype.foo='my de'
  6. }
  7. console.log(new Mycgass().foo);

2.装饰器实现继承

  1. //这里将list对象展开后,将其属性放到目标元素的原型上
  2. function mixin(...list){
  3. return function(target){
  4. Object.assign(target.prototype,...list)
  5. }
  6. }
  7. const Foo={
  8. foo(){
  9. console.log('foo');
  10. }
  11. }
  12. @mixin(Foo)
  13. class Myclass{
  14. }
  15. new Myclass().foo()

3.装饰器修饰类成员

  1. //装饰器修饰类的内部成员
  2. class Mrclass{
  3. @readonly message='heelo'
  4. @noenumerable bar='fff'
  5. }
  6. function readonly(target,name,descriptor){
  7. console.log(target);//目标类的prototype
  8. console.log(name);//被修饰类成员的名称
  9. console.log(descriptor);//被修饰的类成员的描述对象
  10. //只读的
  11. descriptor.writable=false
  12. }
  13. function noenumerable(target,name,descriptor){
  14. console.log(target);//目标类的prototype
  15. console.log(name);//被修饰类成员的名称
  16. console.log(descriptor);//被修饰的类成员的描述对象
  17. //不可以被遍历
  18. descriptor.enumerable=false
  19. }
  20. const c=new Mrclass()
  21. console.log(c.message);
  22. for(let k in c){
  23. console.log(c[k]);
  24. }