本文介绍如何利用JavaScript中的享元模式优化文件上传功能。针对大量文件上传导致浏览器假死的问题,通过复用对象实例减少内存占用,确保在上传数千个文件时保持系统稳定,避免创建过多冗余对象。
本文通过具体示例展示如何在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程序设计工作提供帮助。