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 相关文章推荐
js 处理URL实用技巧
Nov 23 Javascript
jQuery 幻灯片插件(带缩略图功能)
Jan 24 Javascript
Js 导出table内容到Excel的简单实例
Nov 19 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
Feb 23 Javascript
Angularjs中使用layDate日期控件示例
Jan 11 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
Jan 23 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
Mar 01 Javascript
JS作用域链详解
Jun 26 Javascript
Vue基本使用之对象提供的属性功能
Apr 30 Javascript
jquery实现动态创建form并提交的方法示例
May 27 jQuery
解决Echarts2竖直datazoom滑动后显示数据不全的问题
Jul 20 Javascript
jquery实现拖拽小方块效果
Dec 10 jQuery
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
怎样在UNIX系统下安装php3
2006/10/09 PHP
Ajax PHP简单入门教程代码
2008/04/25 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
国外大牛IE版本检测!现在IE都到9了,IE检测代码
2012/01/04 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
浅谈EasyUI常用控件的禁用方法
2016/11/09 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
vue  elementUI 表单嵌套验证的实例代码
2019/11/06 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
解决js中的setInterval清空定时器不管用问题
2020/11/17 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
Python实现可自定义大小的截屏功能
2018/01/20 Python
Python多线程编程之多线程加锁操作示例
2018/09/06 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
最新的大学生找工作自我评价
2013/09/29 职场文书
活动策划邀请函
2014/02/06 职场文书
商铺租赁意向书
2014/04/01 职场文书
团队拓展活动方案
2014/08/28 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
2015年党员自评材料
2014/12/17 职场文书
MySQL单表千万级数据处理的思路分享
2021/06/05 MySQL