JavaScript装饰器函数(Decorator)实例详解
发布时间 - 2026-01-11 00:26:55 点击率:次本文实例讲述了JavaScript装饰器函数(Decorator)。分享给大家供大家参考,具体如下:

装饰器函数(Decorator)用于给对象在运行期间动态的增加某个功能,职责等。相较通过继承的方式来扩充对象的功能,装饰器显得更加灵活,首先,我们可以动态给对象选定某个装饰器,而不用hardcore继承对象来实现某个功能点。其次:继承的方式可能会导致子类繁多,仅仅为了增加某一个单一的功能点,显得有些多余了。
下面给出几个常用的装饰器函数示例,相关代码请查看github。
1 动态添加onload监听函数
function addLoadEvent(fn) {
var oldEvent = window.onload;
if(typeof window.onload != 'function') {
window.onload = fn;
}else {
window.onload = function() {
oldEvent();
fn();
};
}
}
function fn1() {
console.log('onloadFunc 1');
}
function fn2() {
console.log('onloadFunc 2');
}
function fn3() {
console.log('onloadFunc 3');
}
addLoadEvent(fn1);
addLoadEvent(fn2);
addLoadEvent(fn3);
2 前置执行函数和后置执行函数
Function.prototype.before = function(beforfunc) {
var self = this;
var outerArgs = Array.prototype.slice.call(arguments, 1);
return function() {
var innerArgs = Array.prototype.slice.call(arguments);
beforfunc.apply(this, innerArgs);
self.apply(this, outerArgs);
};
};
Function.prototype.after = function(afterfunc) {
var self = this;
var outerArgs = Array.prototype.slice.call(arguments, 1);
return function() {
var innerArgs = Array.prototype.slice.call(arguments);
self.apply(this, outerArgs);
afterfunc.apply(this, innerArgs);
};
};
var func = function(name){
console.log('I am ' + name);
};
var beforefunc = function(age){
console.log('I am ' + age + ' years old');
};
var afterfunc = function(gender){
console.log('I am a ' + gender);
};
var beforeFunc = func.before(beforefunc, 'Andy');
var afterFunc = func.after(afterfunc, 'Andy');
beforeFunc('12');
afterFunc('boy');
执行结果,控制台打印如下:
I am 12 years old I am Andy I am Andy I am a boy
3 函数执行时间计算
function log(func){
return function(...args){
const start = Date.now();
let result = func(...args);
const used = Date.now() - start;
console.log(`call ${func.name} (${args}) used ${used} ms.`);
return result;
};
}
function calculate(times){
let sum = 0;
let i = 1;
while(i < times){
sum += i;
i++;
}
return sum;
}
runCalculate = log(calculate);
let result = runCalculate(100000);
console.log(result);
注:这里我使用了ES2015(ES6)语法,如果你感兴趣可以查看前面关于ES6的相关内容。
当然,装饰器函数不仅仅这些用法。天猫使用的Nodejs框架Koa就基于装饰器函数及ES2015的Generator。希望这篇文章能起到抛砖引玉的作用,使你编写更优雅的JS代码。
更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
# JavaScript
# 装饰器函数
# Decorator
# nuxt框架中路由鉴权之Koa和Session的用法
# es7学习教程之Decorators(修饰器)详解
# 利用Decorator如何控制Koa路由详解
# 相关内容
# 几个
# 如果你
# 子类
# 遍历
# 执行时间
# 感兴趣
# 我们可以
# 抛砖引玉
# 数据结构
# 给大家
# 使你
# 这篇文章
# 更多关于
# 来实现
# 所述
# 程序设计
# 请查看
# 可以查看
# 面向对象
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
java获取注册ip实例
简单实现Android验证码
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
公司门户网站制作流程,华为官网怎么做?
Laravel如何使用Service Container和依赖注入?(代码示例)
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Laravel如何创建自定义Artisan命令?(代码示例)
EditPlus中的正则表达式实战(6)
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
网站制作价目表怎么做,珍爱网婚介费用多少?
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
如何在自有机房高效搭建专业网站?
javascript中的try catch异常捕获机制用法分析
青岛网站建设如何选择本地服务器?
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何在万网自助建站平台快速创建网站?
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
成都网站制作公司哪家好,四川省职工服务网是做什么用?
bootstrap日历插件datetimepicker使用方法
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
制作企业网站建设方案,怎样建设一个公司网站?
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
长沙企业网站制作哪家好,长沙水业集团官方网站?
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
如何在IIS中配置站点IP、端口及主机头?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
音响网站制作视频教程,隆霸音响官方网站?
怎样使用JSON进行数据交换_它有什么限制
如何在服务器上配置二级域名建站?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel如何处理异常和错误?(Handler示例)
太平洋网站制作公司,网络用语太平洋是什么意思?
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
用v-html解决Vue.js渲染中html标签不被解析的问题
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
Laravel如何自定义分页视图?(Pagination示例)
如何彻底删除建站之星生成的Banner?
昵图网官方站入口 昵图网素材图库官网入口
微信公众帐号开发教程之图文消息全攻略
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
高性能网站服务器部署指南:稳定运行与安全配置优化方案

