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
Nov 25 Javascript
JavaScript实现简单的tab选项卡切换
Jan 05 Javascript
JavaScript动态生成二维码图片
Apr 20 Javascript
探寻JavaScript中this指针指向
Apr 23 Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 Javascript
jQuery验证表单格式的使用方法
Jan 10 Javascript
详解本地Node.js服务器作为api服务器的解决办法
Feb 28 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
Mar 17 Javascript
JS简单获取当前日期和农历日期的方法
Apr 17 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
Apr 22 Javascript
vue请求本地自己编写的json文件的方法
Apr 25 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
Jul 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
php GeoIP的使用教程
2011/03/09 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
javascript放大镜效果的简单实现
2013/12/09 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
Python动态导入模块的方法实例分析
2018/06/28 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
药学专业毕业生求职信
2013/10/20 职场文书
环境工程毕业生自荐信
2013/11/17 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
员工工作能力评语
2014/12/31 职场文书