JavaScript装饰器函数(Decorator)实例详解


Posted in Javascript onMarch 30, 2017

本文实例讲述了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);

JavaScript装饰器函数(Decorator)实例详解

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的相关内容。

JavaScript装饰器函数(Decorator)实例详解

当然,装饰器函数不仅仅这些用法。天猫使用的Nodejs框架Koa就基于装饰器函数及ES2015的Generator。希望这篇文章能起到抛砖引玉的作用,使你编写更优雅的JS代码。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
node.js中的buffer.Buffer.isEncoding方法使用说明
Dec 14 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
Sep 15 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
May 05 Javascript
VUE实现表单元素双向绑定(总结)
Aug 08 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
Feb 23 Javascript
JS基于封装函数实现的表格分页完整示例
Jun 26 Javascript
vue webpack打包后图片路径错误的完美解决方法
Dec 07 Javascript
通过实例解析js简易模块加载器
Jun 17 Javascript
微信小程序实现购物车代码实例详解
Aug 29 Javascript
weui上传多图片,压缩,base64编码的示例代码
Jun 22 Javascript
Element Steps步骤条的使用方法
Jul 26 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
Aug 22 Javascript
Angular.JS去掉访问路径URL中的#号详解
Mar 30 #Javascript
详解Angular.js数据绑定时自动转义html标签及内容
Mar 30 #Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 #Javascript
Angular.js去除页面中显示的空行方法示例
Mar 30 #Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
Mar 30 #Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
Mar 30 #Javascript
JavaScript mixin实现多继承的方法详解
Mar 30 #Javascript
You might like
PHP入门经历和学习过程分享
2014/04/11 PHP
PHP安装threads多线程扩展基础教程
2015/11/17 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
PHP 匿名函数与注意事项详细介绍
2016/11/26 PHP
js操作二级联动实现代码
2010/07/27 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
[01:57]2018DOTA2亚洲邀请赛赛前采访-iG
2018/04/03 DOTA
Python psutil模块简单使用实例
2015/04/28 Python
python编程嵌套函数实例代码
2018/02/11 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
生产部经理岗位职责
2013/12/16 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
村官个人总结范文
2015/03/03 职场文书
《认识钟表》教学反思
2016/02/16 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js