一 类装饰器
1 直接创建
@sealed
class Dog {
bark() {
console.log('汪~');
}
}
// 装饰器
function sealed(target){
Object.seal(target);
Object.seal(target.prototype);
}
// 不能添加新属性(Uncaught TypeError: Cannot add property nick, object is not extensible)
Dog.nick = '狗狗';
console.log(Dog.nick); // undefined
2 使用装饰器工厂
@testable(true)
class Greeter {
greet() {
console.log(`hello`);
}
}
// 装饰器工厂
function testable(isTestable) {
// 返回装饰器
return function(target){
target.isTestable = isTestable;
}
}
Greeter.isTestable // true
二 方法装饰器
1 取值函数(gettter)、存值函数(setter)
class Person{
children = [];
@nonenumerable
get kidCount(){
return this.children.length;
}
}
// 装饰器
function nonenumerable(target,name,descriptor){
descriptor.enumerable = false;
return descriptor;
}
console.log(Object.keys(Person.prototype)); // []
2 普通方法
class Math{
@log
add(a,b){
return a + b;
}
}
// 装饰器
function log(target,name,descriptor){
var oldValue = descriptor.value;
descriptor.value = function(){
console.log(`调用${name}方法`);
return oldValue.apply(null,arguments);
}
// 返回新的属性描述符
return descriptor;
}
new Math().add(1,2); // "调用add方法"