hand
_1_11_207
4
返回栏目
0k
2k
1k
2k
1k
1k
1k
2k
2k
2k
1k
2k
1k
2k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
1k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
1k
2k
1k
1k
1k
1k
1k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
1k
1k
2k
1k
1k
2k
2k
1k
2k
1k
1k
2k
2k
2k
3k
3k
2k
3k
2k
3k
3k
3k
1k
2k
3k
2k
2k
3k
3k
2k
2k
6k
3k
2k
2k
5k
3k
4k
3k
3k
2k
4k
3k
3k
2k
3k
3k
1k
4k
4k
4k
2k
5k
3k
2k
3k
4k
3k
3k
4k
2k
3k
3k
4k
2k
2k
3k
4k
3k
3k
2k
5k
2k
3k
3k
3k
3k
2k
3k
3k
3k
2k
2k
2k
2k
3k
2k
2k
2k
3k
2k
2k
2k
2k
2k
2k
0.1k
0.2k
3k
2k
3k
2k
0.1k
2k
2k
4k
2k
2k
1k
2k
2k
3k
3k
3k
3k
2k
2k
3k
3k
3k
4k
3k
3k
4k
3k
2k
2k
3k
3k
3k
3k
3k
3k
2k
3k
3k
4k
4k
3k
3k
2k
2k
3k
2k
2k
1k
2k
3k
1k
2k
2k
2k
2k
2k
2k
2k
2k
2k
4k
2k
3k
2k
1k
2k
2k
2k
2k
2k
3k
2k
3k
1k
2k
2k
2k
0k
2k
2k
2k
2k
2k
2k
2k
3k
2k
2k
1k
1k
3k
2k
3k
1k
2k
1k
2k
2k
2k
2k
3k
1k
3k
2k
2k
2k
2k
2k
2k
1k
2k
2k
4k
3k
3k
2k
2k
2k
2k
2k
2k
4k
3k
3k
3k
2k
2k
2k
2k
2k
2k
3k
4k
返回前端 - Javascript栏目
作者:
贺及楼
成为作者
更新日期:2025-02-21 20:48:47
在前端开发中,JavaScript 不断发展,新的特性和语法层出不穷。装饰器(Decorators)就是其中一个非常强大且实用的特性,它能够在不修改原有代码结构的前提下,对类、方法、属性等进行增强和扩展。装饰器就像是给代码穿上了一件“魔法外衣”,让代码具备更多的功能和更好的可读性。
装饰器是一种特殊的声明,它可以被附加到类声明、方法、属性或参数上,用来修改类的行为。简单来说,装饰器是一个函数,它接收目标对象作为参数,并返回一个新的对象或者对原对象进行修改。
装饰器是一个函数,它可以使用 @
符号应用到类、方法、属性等上面。下面是一个简单的装饰器示例:
// 定义一个装饰器函数
function log(target, name, descriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args) {
console.log(`调用方法 ${name},参数:`, args);
const result = originalMethod.apply(this, args);
console.log(`方法 ${name} 执行完毕,结果:`, result);
return result;
};
return descriptor;
}
class Calculator {
@log
add(a, b) {
return a + b;
}
}
const calc = new Calculator();
calc.add(2, 3);
类装饰器应用于类构造函数,可以用来监视、修改或替换类定义。
function classDecorator(constructor) {
return class extends constructor {
newProperty = '新属性';
hello() {
return 'Hello from decorated class';
}
};
}
@classDecorator
class MyClass {
constructor() {
this.message = '原始类';
}
}
const instance = new MyClass();
console.log(instance.newProperty);
console.log(instance.hello());
方法装饰器应用于类的方法上,它接收三个参数:目标对象、方法名和属性描述符。
function methodDecorator(target, name, descriptor) {
const originalMethod = descriptor.value;
descriptor.value = function () {
console.log(`调用方法 ${name}`);
return originalMethod.apply(this, arguments);
};
return descriptor;
}
class MyClass {
@methodDecorator
myMethod() {
console.log('执行方法');
}
}
const obj = new MyClass();
obj.myMethod();
属性装饰器应用于类的属性上,它接收两个参数:目标对象和属性名。
function propertyDecorator(target, propertyKey) {
let value = target[propertyKey];
const getter = () => {
console.log(`获取属性 ${propertyKey}`);
return value;
};
const setter = (newValue) => {
console.log(`设置属性 ${propertyKey} 为 ${newValue}`);
value = newValue;
};
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
}
class MyClass {
@propertyDecorator
myProperty = '初始值';
}
const obj = new MyClass();
console.log(obj.myProperty);
obj.myProperty = '新值';
装饰器的本质是一个函数,它的执行过程如下:
装饰器类型 | 应用位置 | 接收参数 | 作用 |
---|---|---|---|
类装饰器 | 类构造函数 | 构造函数 | 监视、修改或替换类定义 |
方法装饰器 | 类的方法 | 目标对象、方法名、属性描述符 | 修改方法的行为 |
属性装饰器 | 类的属性 | 目标对象、属性名 | 拦截属性的获取和设置操作 |
装饰器是 JavaScript 中一个非常强大的特性,它可以帮助我们编写更加模块化、可维护和可扩展的代码。通过合理使用装饰器,我们可以在不修改原有代码的基础上,为代码添加额外的功能,提高开发效率。虽然装饰器目前还处于提案阶段,但在许多现代 JavaScript 框架中已经得到了广泛的应用。
前端 - Javascript
整章节共299节
快分享给你的小伙伴吧 ~