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 相关文章推荐
基于jQuery的可以控制左右滚动及自动滚动效果的代码
Jul 25 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
Aug 11 Javascript
javascript实现移动端上的触屏拖拽功能
Mar 04 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
Aug 25 Javascript
基于jQuery制作小图标上下滑动特效
Jan 18 Javascript
Vue2.0 UI框架ElementUI使用方法详解
Apr 14 Javascript
angular中子控制器向父控制器传值的实例
Oct 08 Javascript
vue项目中使用Svg的方法
Oct 24 Javascript
微信小程序云开发之使用云数据库
May 17 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
Sep 06 Javascript
JavaScript利用键盘码控制div移动
Mar 19 Javascript
基于JS实现视频上传显示进度条
May 12 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
JavaScript 数组运用实现代码
2010/04/13 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
Openlayers实现图形绘制
2020/09/28 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
Python Queue模块详解
2014/11/30 Python
更改Python命令行交互提示符的方法
2015/01/14 Python
python下载图片实现方法(超简单)
2017/07/21 Python
Python中反射和描述器总结
2018/09/23 Python
pandas数据集的端到端处理
2019/02/18 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
python中str内置函数用法总结
2020/12/27 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
vue项目实现分页效果
2021/03/24 Vue.js
中学生运动会入场词
2014/02/12 职场文书
大课间体育活动方案
2014/03/12 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
爱护公物演讲稿
2014/09/09 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
初三毕业评语
2014/12/26 职场文书
导游词之神仙居景区
2019/11/15 职场文书