装饰器(Decorator)是一种用于修改类、方法或属性行为的语法糖,它在现代编程语言中被广泛应用。在ArkTS中,装饰器为开发者提供了强大的工具来增强代码的功能性和可维护性。本文将深入探讨如何在ArkTS中正确使用装饰器,并通过实际案例解析其应用场景。
装饰器本质上是一个函数,它能够接收目标对象(类、方法、属性等),并对其进行修改或扩展。在ArkTS中,装饰器可以用于以下场景:
根据作用范围的不同,装饰器可以分为以下几类:
类装饰器可以直接修饰一个类,并对类本身进行修改或扩展。例如:
function logClass(target: Function) {
console.log("类被装饰了", target);
}
@logClass
class MyClass {
greet() {
console.log("Hello, World!");
}
}
new MyClass().greet();
方法装饰器可以用来修饰类中的方法,通常用于日志记录或性能监控等场景。
function logMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`调用了 ${propertyKey} 方法,参数为:`, args);
const result = originalMethod.apply(this, args);
console.log(`返回值为:`, result);
return result;
};
}
class MathOperations {
@logMethod
add(a: number, b: number): number {
return a + b;
}
}
const math = new MathOperations();
math.add(2, 3);
属性装饰器可以用来修饰类的属性,通常用于验证属性值或添加元数据。
function validateMinLength(length: number) {
return function (target: any, propertyKey: string) {
let value: string;
const getter = function () {
return value;
};
const setter = function (newValue: string) {
if (newValue.length < length) {
throw new Error(`${propertyKey} 的长度不能小于 ${length}`);
}
value = newValue;
};
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter,
enumerable: true,
configurable: true,
});
};
}
class User {
@validateMinLength(5)
username: string;
constructor(username: string) {
this.username = username;
}
}
try {
const user = new User("John"); // 抛出错误,因为 "John" 的长度小于5
} catch (error) {
console.error(error.message);
}
装饰器可以用来记录方法的调用信息,这对于调试和性能分析非常有用。
function logExecutionTime(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
const startTime = Date.now();
const result = originalMethod.apply(this, args);
const endTime = Date.now();
console.log(`${propertyKey} 执行时间: ${endTime - startTime}ms`);
return result;
};
}
class DataProcessor {
@logExecutionTime
processData(data: any[]): void {
for (let i = 0; i < data.length; i++) {
console.log(data[i]);
}
}
}
const processor = new DataProcessor();
processor.processData([1, 2, 3, 4, 5]);
装饰器可以用来实现权限检查,确保只有授权用户才能调用某些方法。
function requireAdminRole(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
const isAdmin = checkAdminRole(); // 假设有一个函数来检查用户是否为管理员
if (!isAdmin) {
throw new Error("需要管理员权限");
}
return originalMethod.apply(this, args);
};
}
function checkAdminRole(): boolean {
// 模拟权限检查逻辑
return false;
}
class AdminActions {
@requireAdminRole
deleteData(): void {
console.log("数据已删除");
}
}
const admin = new AdminActions();
try {
admin.deleteData(); // 抛出错误,因为当前用户不是管理员
} catch (error) {
console.error(error.message);
}
装饰器为ArkTS开发者提供了一种优雅的方式来增强代码功能,无论是日志记录、权限控制还是性能监控,都可以通过装饰器轻松实现。掌握装饰器的正确使用姿势,将帮助你在开发中更加高效地解决问题。