JavaScript使用享元模式實(shí)現(xiàn)文件上傳優(yōu)化操作示例
本文實(shí)例講述了JavaScript使用享元模式實(shí)現(xiàn)文件上傳優(yōu)化操作。分享給大家供大家參考,具體如下:
一、享元模式是一種用于性能優(yōu)化的模式,主要優(yōu)化方式為,若系統(tǒng)中因?yàn)閯?chuàng)建了大量類似的對(duì)象而導(dǎo)致內(nèi)存占用過高,則可以考慮使用享元模式實(shí)現(xiàn)。
二、實(shí)例說明:
如果在瀏覽器中上傳文件,若使用常規(guī)寫法, 每上傳一個(gè)文件,就會(huì)創(chuàng)建一個(gè)實(shí)例對(duì)象;如果上傳2000個(gè)文件,那就有2000個(gè)對(duì)象,瀏覽器很可能出現(xiàn)假死狀態(tài)。這種情況下,我們考慮適應(yīng)享元模式。
三、實(shí)例:
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('確定要?jiǎng)h除該文件嗎?' + 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 ]; } } } })();
然后需要寫一個(gè)觸發(fā)上傳動(dòng)作的startUpload
函數(shù):
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 ); } };
最后調(diào)用,如下:
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 } ]);
四、解釋:
調(diào)用時(shí),有六個(gè)對(duì)象,但只有兩個(gè)類型(plugin和flash),我們通過享元模式,在創(chuàng)建對(duì)象時(shí),只有兩個(gè),如果上面提到的上傳2000個(gè)文件,利用上面的代碼,同樣只創(chuàng)建兩個(gè)對(duì)象,那么這就很好的解決了瀏覽器崩潰假死的問題。
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
2012世界末日倒計(jì)時(shí)代碼 原來沒事虛驚一場(chǎng)
這款時(shí)世界末日倒計(jì)時(shí)源代碼,程序上有JS控制器,是用于網(wǎng)頁(yè)中顯示的倒計(jì)時(shí)器,自己可以設(shè)定世界末日的開始時(shí)間,網(wǎng)頁(yè)倒計(jì)時(shí)世界末日源代碼直接復(fù)制就可以用2012-12-12使用javascript實(shí)現(xiàn)Iframe自適應(yīng)高度
這篇文章主要介紹了使用javascript實(shí)現(xiàn)Iframe自適應(yīng)高度,需要的朋友可以參考下2014-12-12JS打印gridview實(shí)現(xiàn)原理及代碼
打印gridview對(duì)于一些童鞋們真的是很陌生啊,不過沒有關(guān)系,因?yàn)楸疚牡某霈F(xiàn),或讓你茅塞頓開,好了話不多說,感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)js高級(jí)知識(shí)有所幫助2013-02-02一個(gè)JavaScript防止表單重復(fù)提交的實(shí)例
防止重復(fù)表單提交的方法有很多,本文使用JavaScript來實(shí)現(xiàn)防止表單重復(fù)提交,很簡(jiǎn)單,但很實(shí)用,新手朋友們不要錯(cuò)過2014-10-10動(dòng)態(tài)生成的IFRAME,設(shè)置SRC時(shí)的,不同位置帶來的影響
動(dòng)態(tài)生成的IFRAME,設(shè)置SRC時(shí)的,不同位置帶來的影響。 以下所說的是在IE7下運(yùn)行的。IE6下也是同樣。 在這個(gè)blog中,直接點(diǎn)擊運(yùn)行代碼,和把下面代碼保存到為網(wǎng)頁(yè)在運(yùn)行(以本地文件或域名訪問),效果不一樣。2008-03-03收集的一些Array及String原型對(duì)象的擴(kuò)展實(shí)現(xiàn)代碼
收集的一些Array及String原型對(duì)象的擴(kuò)展實(shí)現(xiàn)代碼,學(xué)習(xí)js的朋友可以參考下。并可以自定義的對(duì)字符串與array數(shù)據(jù),進(jìn)行擴(kuò)展。2010-12-12