您好,欢迎访问宜昌市隼壹珍商贸有限公司
400 890 5375JavaScript装饰器结合Reflect Metadata可实现AOP,通过类、方法、属性和参数装饰器解耦横切逻辑;利用Reflect.defineMetadata存储元数据,如权限角色,并在执行时动态拦截方法进行校验,实现日志、权限控制等功能,提升代码复用与可维护性。
JavaScript 装饰器是一种强大的元编程特性,允许我们在类、方法、属性或参数定义时附加逻辑,改变其行为。虽然目前仍处于提案阶段(Stage 3),但通过 Babel 或 TypeScript 已可广泛使用。结合元数据反射(Reflect Metadata),装饰器能实现面向切面编程(AOP),将横切关注点如日志、权限校验、性能监控等与业务逻辑解耦。
装饰器本质是一个函数,接收目标对象、属性名和描述符作为参数,在运行时被调用。根据应用位置不同,分为:
示例:一个简单的日志方法装饰器
function Log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {要实现更复杂的 AOP 场景,需借助元数据系统存储额外信息。TypeScript 配合 reflect-metadata 库可实现这一能力。
启用步骤:
npm install reflect-metadata --save
emitDecoratorMetadata: true
im
port 'reflect-metadata'
通过 Reflect.defineMetadata 和 Reflect.getMetadata 存取元数据,例如标记某个方法需要权限校验:
AOP 的核心是将横切逻辑集中管理。利用装饰器与元数据,可在不侵入业务代码的前提下织入切面逻辑。
实现一个权限检查切面:
function Secure(target: any, propertyKey: string, descriptor: PropertyDescriptor) {使用方式:
class UserService {常见用途包括:
注意点:
基本上就这些。装饰器+元数据为 JavaScript 提供了接近框架级的能力,合理使用能让代码更清晰、职责更分明。虽然标准尚未最终落地,但在 TypeScript 生态中已是成熟实践。不复杂但容易忽略的是元数据的键冲突问题,建议使用 Symbol 作为 key 来避免命名污染。