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 相关文章推荐
js拦截alert对话框另类应用
Jan 16 Javascript
JS中不为人知的五种声明Number的方式简要概述
Feb 22 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
Nov 26 Javascript
JS获取当前网页大小以及屏幕分辨率等
Sep 05 Javascript
js实现上传图片预览的方法
Feb 09 Javascript
JavaScript删除数组元素的方法
Mar 20 Javascript
解析javascript中鼠标滚轮事件
May 26 Javascript
js实现简洁大方的二级下拉菜单效果代码
Sep 01 Javascript
ES6新增的math,Number方法
Aug 06 Javascript
javascript实现5秒倒计时并跳转功能
Jun 20 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 Javascript
如何在现代JavaScript中编写异步任务
Jan 31 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
9个经典的PHP代码片段分享
2014/12/18 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
php编写的抽奖程序中奖概率算法
2015/05/14 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
php 可变函数使用小结
2018/06/12 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
岗位职责定义及内容
2013/11/08 职场文书
高中自我评价分享
2013/12/05 职场文书
投资意向书范本
2014/04/01 职场文书
继承权公证书
2014/04/09 职场文书
顶岗实习协议书
2015/01/29 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB