1.装饰器的基本使用
//装饰器就是修饰类的一个函数
//添加类的静态成员
function fn(target){
target.foo='bar'
}
@fn
class Myclass{}
console.log(Myclass.foo);
//带参数的装饰器
@fn2(10)
class Mycfass{}
function fn2(value){
return function(target){
target.count=value
}
}
console.log(Mycfass.count);
);
//在装饰器的实例上添加实例成员
@fn3
class 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]);
}