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 相关文章推荐
JavaScript 三种不同位置代码的写法
Oct 25 Javascript
js中判断用户输入的值是否为空的简单实例
Dec 23 Javascript
jquery 为a标签绑定click事件示例代码
Jun 23 Javascript
为什么JS中eval处理JSON数据要加括号
Apr 13 Javascript
详解Javascript继承的实现
Mar 25 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
May 03 Javascript
Vue.Draggable实现拖拽效果
Jul 29 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
Jan 09 Javascript
jQuery中each和js中forEach的区别分析
Feb 27 jQuery
fastadmin中调用js的方法
May 14 Javascript
vuejs实现下拉框菜单选择
Oct 23 Javascript
javascript实现用户必须勾选协议实例讲解
Mar 24 Javascript
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翻页跳转功能实现方法
2020/11/30 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
jquery tools系列 expose 学习
2009/09/06 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
VUE DOM加载后执行自定义事件的方法
2018/09/07 Javascript
koa源码中promise的解读
2018/11/13 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
Python运行的17个时新手常见错误小结
2012/08/07 Python
Python中查看文件名和文件路径
2017/03/31 Python
python进阶之自定义可迭代的类
2019/08/20 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
python 实现字符串下标的输出功能
2020/02/13 Python
Python reversed函数及使用方法解析
2020/03/17 Python
CSS3属性选择符介绍
2008/10/17 HTML / CSS
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
青年文明号复核材料
2014/02/11 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
技术员个人工作总结
2015/03/03 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python