
JavaScript 中没有原生的“方法装饰器”语法(如 TypeScript 的 @decorator),但可以通过操作原型链,在运行时动态增强类方法的行为——这本质上就是手动实现装饰器逻辑的核心思路。
在原型上拦截并包装方法
装饰器的关键是不修改原始方法,而是用一个新函数包裹它,在调用前后插入逻辑。由于实例方法最终都来自原型,我们可以直接修改原型上的方法引用:
- 获取目标方法的原始引用(如
target.prototype[methodName]) - 用新函数替代它,新函数内部调用原方法,并添加前置/后置逻辑(如日志、权限检查、性能统计)
- 注意绑定
this,确保原方法执行时上下文正确
支持参数透传与返回值处理
一个实用的装饰器必须保持方法签名不变。包装函数需使用 ...args 接收所有参数,并 return 原方法结果,否则会破坏调用方预期:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 错误写法:
fn(...args); // 忘记 return → 返回 undefined - 正确写法:
return fn.apply(this, args);或return fn(...args); - 若需改写返回值(如缓存、转换),应在
return前处理
避免污染全局原型,推荐按需装饰
直接修改 Array.prototype 或 Object.prototype 是危险的。应聚焦于具体类的原型,且最好封装成可复用函数:
- 定义装饰器工厂:如
function logDecorator(methodName) { ... } - 在类定义后、实例化前调用:
logDecorator('getData')(MyClass); - 也可结合
Object.defineProperty实现更精细控制(如设置writable: false防误覆盖)
与现代方案的对比提醒
ES2023 已标准化装饰器提案(Stage 4),Babel 和 TypeScript 都支持 @ 语法。原型链方式适合学习原理或兼容旧环境,但生产项目中优先使用标准装饰器语法 + 编译工具链,更安全、可维护性更高。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










