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?  昵图网官方站入口 昵图网素材图库官网入口  微信公众帐号开发教程之图文消息全攻略  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  高性能网站服务器部署指南:稳定运行与安全配置优化方案