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 选择文件夹对话框(web)
Jul 07 Javascript
js计算页面刷新的次数
Jul 20 Javascript
js获取url参数代码实例分享(JS操作URL)
Dec 13 Javascript
js实现YouKu的漂亮搜索框效果
Aug 19 Javascript
Bootstrap实现响应式导航栏效果
Dec 28 Javascript
只需五句话搞定JavaScript作用域(经典)
Jul 26 Javascript
微信小程序-详解数据缓存
Nov 24 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
老生常谈js中的MVC
Jul 25 Javascript
vue中axios处理http发送请求的示例(Post和get)
Oct 13 Javascript
vue实现简单的星级评分组件源码
Nov 16 Javascript
Vue实现微信支付功能遇到的坑
Jun 05 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
推荐几部必看的DC动画电影
2020/03/03 欧美动漫
增加反向链接的101个方法 站长推荐
2007/01/31 PHP
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
PHP的5个安全措施小结
2012/07/17 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
javascript使用activex控件的代码
2011/01/27 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
pandas series序列转化为星期几的实例
2018/04/11 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
美国宠物护理专家:Revival Animal Health
2020/01/05 全球购物
审计工作个人的自我评价
2013/12/25 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
介绍信样本
2015/01/31 职场文书
英语辞职信范文
2015/02/28 职场文书
500字作文之周记
2019/12/13 职场文书
Django基础CBV装饰器和中间件
2022/03/22 Python
pd.drop_duplicates删除重复行的方法实现
2022/06/16 Python