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 相关文章推荐
基于jQuery实现的水平和垂直居中的div窗口
Aug 08 Javascript
将查询条件的input、select清空
Jan 14 Javascript
页面装载js及性能分析方法介绍
Mar 21 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
Aug 19 Javascript
基于jQuery实现下拉框
Nov 24 Javascript
JavaScript中的原型prototype属性使用详解
Jun 05 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
Dec 27 Javascript
微信小程序开发经验总结(推荐)
Jan 11 Javascript
详解.vue文件解析的实现
Jun 11 Javascript
发布一款npm包帮助理解npm的使用
Jan 03 Javascript
在vue中使用回调函数,this调用无效的解决
Aug 11 Javascript
jQuery实现推拉门效果
Oct 19 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
正则表达式语法
2006/10/09 Javascript
一道关于php变量引用的面试题
2010/08/08 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
PHP处理会话函数大总结
2015/08/05 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
2017/08/10 PHP
PHP操作redis实现的分页列表,新增,删除功能封装类与用法示例
2018/08/04 PHP
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
vue实现选中效果
2020/10/07 Javascript
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
Python类的基础入门知识
2008/11/24 Python
在Django框架中运行Python应用全攻略
2015/07/17 Python
Python实现针对中文排序的方法
2017/05/09 Python
在Python dataframe中出生日期转化为年龄的实现方法
2018/10/20 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
CSS3绘制圆角矩形的简单示例
2015/09/28 HTML / CSS
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
HTML5图片预览实例分享
2014/06/04 HTML / CSS
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
五水共治捐款倡议书
2014/05/14 职场文书
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python