1.装饰器的基本使用
//装饰器就是修饰类的一个函数//添加类的静态成员function fn(target){ target.foo='bar'}@fnclass Myclass{}console.log(Myclass.foo);//带参数的装饰器@fn2(10)class Mycfass{}function fn2(value){ return function(target){ target.count=value }}console.log(Mycfass.count););
//在装饰器的实例上添加实例成员@fn3class Mycgass{}function fn3(target){ target.prototype.foo='my de'}console.log(new Mycgass().foo);
2.装饰器实现继承
//这里将list对象展开后,将其属性放到目标元素的原型上function mixin(...list){ return function(target){ Object.assign(target.prototype,...list) }}const Foo={ foo(){ console.log('foo'); }}@mixin(Foo)class Myclass{}new Myclass().foo()
3.装饰器修饰类成员
//装饰器修饰类的内部成员class Mrclass{ @readonly message='heelo' @noenumerable bar='fff'}function readonly(target,name,descriptor){ console.log(target);//目标类的prototype console.log(name);//被修饰类成员的名称 console.log(descriptor);//被修饰的类成员的描述对象 //只读的 descriptor.writable=false}function noenumerable(target,name,descriptor){ console.log(target);//目标类的prototype console.log(name);//被修饰类成员的名称 console.log(descriptor);//被修饰的类成员的描述对象 //不可以被遍历 descriptor.enumerable=false}const c=new Mrclass()console.log(c.message);for(let k in c){ console.log(c[k]);}