JavaScript使用享元模式实现文件上传优化操作示例


Posted in Javascript onAugust 07, 2018

本文实例讲述了JavaScript使用享元模式实现文件上传优化操作。分享给大家供大家参考,具体如下:

一、享元模式是一种用于性能优化的模式,主要优化方式为,若系统中因为创建了大量类似的对象而导致内存占用过高,则可以考虑使用享元模式实现。

二、实例说明:

如果在浏览器中上传文件,若使用常规写法, 每上传一个文件,就会创建一个实例对象;如果上传2000个文件,那就有2000个对象,浏览器很可能出现假死状态。这种情况下,我们考虑适应享元模式。

三、实例:

var Upload = function( uploadType ){
  this.uploadType = uploadType;
};
Upload.prototype.delFile = function( id ){
  uploadManager.setExternalState( id, this );
  if( this.fileSize < 300 ){
   return this.dom.parentNode.removeChild( this.dom );
  }
  if( window.confirm('确定要删除该文件吗?' + this.fileName )){
     return this.dom.parentNode.removeChild( this.dom);
  }
};
var UploadFactory = (function(){
  var createdFlyWeightObjs = {};
  return {
    create: function( uploadType ){
      if(createFlyWeightObjs[uploadType]){
        return createdFlyWeightObjs[uploadType];
      }
      return createdFlyWeightObjs[uploadType] = new Upload(uploadType);
    }
  }
})();
var uploadManager = (function(){
  var uploadDatabase = {};
  return{
    add: function(id, uploadType, fileName, fileSize){
      var flyWeightObj = UploadFactory.create( uploadType );
      var dom = document.createElement( 'div' );
      dom.innerHTML = '<span>文件名称:'+fileName+',文件大小:' +fileSize + '</span>' + '<button class="delFile">删除</button>';
      dom.querySelector( ".delFile" ).onclick = function(){
       flyWeightObj.delFile( id );
       document.body.appendChild( dom );
       uploadDatabase[ id ] = {
         fileName: fileName,
         fileSize: fileSize,
         dom: dom
       };
       return flyWeightObj;
     },
     setExternalState: functon( id, flyWeightObj ){
        var uploadData = uploadDatabase[ id ];
        for( var i in uploadData){
           flyWeightObj[ i ] = uploadData[ i ];
        }
     }
  }
})();

然后需要写一个触发上传动作的startUpload函数:

var id = o;
window.startUpload = function( uploadType, files ){
  for( var i=0,file; file = fules[ i ++ ];){
     var uploadObj = uploadManger.add( ++id, uploadType, file.fileName, file.fileSize );
  }
};

最后调用,如下:

startUpload( 'plugin', [
  {
    fileName: '1.txt',
    fileSize: 1000
   },
   {
     fileName: '2.html',
     fileSize: 1000
   },
   {
     fileName: '3.txt',
     fileSize: 5000
   }
]);
startUpload( 'flash', [
  {
    fileName: '4.txt',
    fileSize: 1000
   },
   {
     fileName: '5.html',
     fileSize: 1000
   },
   {
     fileName: '6.txt',
     fileSize: 5000
   }
]);

四、解释:

调用时,有六个对象,但只有两个类型(plugin和flash),我们通过享元模式,在创建对象时,只有两个,如果上面提到的上传2000个文件,利用上面的代码,同样只创建两个对象,那么这就很好的解决了浏览器崩溃假死的问题。

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

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

Javascript 相关文章推荐
asp 的 分词实现代码
May 24 Javascript
input标签内容改变的触发事件介绍
Jun 18 Javascript
AngularJS指令与控制器之间的交互功能示例
Dec 14 Javascript
JavaScript实现星级评分
Jan 12 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
May 11 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
Sep 05 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
JS实现数组去重及数组内对象去重功能示例
Feb 02 Javascript
JavaScript实现的联动菜单特效示例
Jul 08 Javascript
jQuery操作元素的内容和样式完整实例分析
Jan 10 jQuery
javascript实现贪吃蛇小游戏
Jul 28 Javascript
解决vue-router的beforeRouteUpdate不能触发
Apr 14 Vue.js
JavaScript设计模式之模板方法模式原理与用法示例
Aug 07 #Javascript
opencv 识别微信登录验证滑动块位置
Aug 07 #Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
Aug 07 #Javascript
深入浅析var,let,const的异同点
Aug 07 #Javascript
springMvc 前端用json的方式向后台传递对象数组方法
Aug 07 #Javascript
JS实现中英文混合文字溢出友好截取功能
Aug 06 #Javascript
JS实现图片上传多次上传同一张不生效的处理方法
Aug 06 #Javascript
You might like
PHP 加密解密内部算法
2010/04/22 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
jQuery获取table行数并输出单元格内容的实现方法
2016/06/30 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
node.js基于mongodb的搜索分页示例
2017/01/22 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
python格式化输出保留2位小数的实现方法
2019/07/02 Python
Python装饰器原理与基本用法分析
2020/01/07 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
关于python 的legend图例,参数使用说明
2020/04/17 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
HTML5实现锚点时请使用id取代name
2013/09/06 HTML / CSS
瀑布模型都有哪些优缺点
2014/06/23 面试题
商务英语应届生自我鉴定
2013/12/08 职场文书
公司庆典邀请函范文
2014/01/13 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
医者仁心观后感
2015/06/17 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
离婚协议书格式范本
2016/03/18 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python