在JavaScript中,装饰器是一种特殊的函数,其主要用途是可以修改或增强现有的类或对象的行为。装饰器一般用于修改类或对象的属性、方法、访问器、参数等。
以下是一些常见的装饰器用法:
1、类装饰器:类装饰器是用于修改类的行为的装饰器。通过 @ 符号和装饰器函数,可以修改类的构造函数以及类的原型属性和方法。
例如:
function decorator(target) {
target.newProperty = 'new property';
}
@decorator
class MyClass {
// ...
}
在上面的代码中,decorator 函数是 MyClass 的装饰器,它添加了一个新的属性 newProperty 到 MyClass 中。
2、方法装饰器:方法装饰器用于修改类的方法。方法装饰器接收三个参数:类的原型对象、方法名和方法的描述对象。通过修改方法的描述对象,可以改变方法的行为。
例如:
function log(target, name, descriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args) {
console.log(`Method ${name} called with args ${args}`);
return originalMethod.apply(this, args);
};
return descriptor;
}
class MyClass {
@log
method(arg1, arg2) {
// ...
}
}
在上面的代码中,log 函数是 MyClass 类的方法装饰器。当 method 被调用时,log 装饰器会在控制台中打印方法名和参数,然后再执行原始方法。
3、属性装饰器:属性装饰器用于修改类的属性。与方法装饰器类似,属性装饰器接收三个参数:类的原型对象、属性名和属性描述对象。通过修改属性的描述对象,可以改变属性的行为。
例如:
function uppercase(target, name) {
let value = target[name];
const getter = function() {
return value;
};
const setter = function(newVal) {
value = newVal.toUpperCase();
};
Object.defineProperty(target, name, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
class MyClass {
@uppercase
name = 'John Doe';
}
在上面的代码中,uppercase 函数是 MyClass 类的属性装饰器。它将 MyClass 类中的 name 属性修改为大写字母形式。
以上是三种常见的装饰器用法。装饰器的应用场景很广泛,可以用于AOP编程和元编程等各种场景。