摘要:源碼下載至此再和面向?qū)ο笳剳賽巯盗形恼乱呀?jīng)全部更新完畢寫文章不易,且行且珍惜
再和“面向?qū)ο蟆闭剳賽?- 對象簡介(一)
再和“面向?qū)ο蟆闭剳賽?- 對象相關(guān)概念(二)
再和“面向?qū)ο蟆闭剳賽?- 面向?qū)ο缶幊谈拍睿ㄈ?br>再和“面向?qū)ο蟆闭剳賽?- class(四)
再和“面向?qū)ο蟆闭剳賽?- 繼承(五)
再和“面向?qū)ο蟆闭剳賽?- super(六)
通過前面的六篇文章已經(jīng)把ES6的面向?qū)ο蟾蠡镎f清楚了,大家最關(guān)心的應(yīng)該是來個例子實(shí)戰(zhàn)一下,別擔(dān)心自行車都會有。那這篇文章通篇就是實(shí)戰(zhàn),我就以一個“圖片預(yù)加載組件”為例子,一步一步拿前面說的東西來實(shí)戰(zhàn)一下。
例子的效果圖: 實(shí)現(xiàn)方式//html說明0/0//javascript const span=document.querySelector("span"), bar=document.querySelector(".bar"); const loader=new ImgLoader({ resources:[ "http://p2.qhimg.com/t01ed1438874f940dc0.jpg", "http://p9.qhimg.com/t01b4ff03b72c7dc6c7.jpg", "http://p2.qhimg.com/t01dd90dfbec92074d0.jpg", "http://p7.qhimg.com/t01cfec6d87cde457c5.jpg", "http://p9.qhimg.com/t01943ced462da67833.jpg", "http://p0.qhimg.com/t01943ced462da67833.jpg", "http://p6.qhimg.com/t01aa15a7ba7ccb49a7.jpg", "http://p8.qhimg.com/t010f1e8badf1134376.jpg", "http://p8.qhimg.com/t01cf37ea915533a032.jpg", "http://p3.qhimg.com/t0193d8a3963e1803e9.jpg", "http://p3.qhimg.com/t01cd6a4d4b4bd4457b.jpg" ], start(total){ console.log(`開始加載: ${total}張圖片`); }, progress(current,total){ console.log(`加載第${current}個`); const percent=current/total*100; bar.style.width=percent+"%"; span.innerHTML=current+"/"+total; }, complete(total){ console.log(`加載完畢: ${total}張圖片`); } }); loader.start();
實(shí)現(xiàn)步驟 1、整體結(jié)構(gòu)進(jìn)度條的顏色為div.bar,不斷修改寬度的百分比就能達(dá)到效果
組件的名稱為ImgLoader,它需要接收一個對象為參數(shù)
resources為圖片地址,是個數(shù)組
start為開始加載前的事件,接收一個參數(shù)為加載圖片的總數(shù)
progress為正在加載事件,接收兩個參數(shù),一個為當(dāng)前正在加載圖片的索引,一個為加載圖片的總數(shù)
complete為加載完成事件,所有圖片加載完成以后觸發(fā),接收一個參數(shù),加載圖片的總數(shù)
(function(){ class ImgLoader{ constructor(config){ } } window.ImgLoader=ImgLoader; })();
組件通常會以模塊的形式去寫,放到一個自執(zhí)行的函數(shù)里面,最后把組件做為window對象的一個屬性暴露出去,這樣能保證在任何一個作用域中都能取到ImgLoader
在new一個實(shí)例的時候需要傳一個對象做為參數(shù),所以在constructor方法里需要給一個形參叫config,
(function(){ class ImgLoader{ constructor(config){ //聲明一個默認(rèn)參數(shù) this.option={ resources:[], start:null, progress:null, complete:null, } if(config){ //走這里說明用戶傳參數(shù)了,那就拿用戶傳的覆蓋掉默認(rèn)的 for(let v in config){ this.option[v]=config[v] } }else{ //走這里說明用戶一個參數(shù)都沒有傳,那就給個警告 alert("參數(shù)錯誤!"); return; } this.total=this.option.resources.length||0; //加載的圖片總數(shù)(||運(yùn)算符是為了保證有個數(shù)值) this.currentIndex=0; //當(dāng)前正在加載的是哪一個圖片 } } window.ImgLoader=ImgLoader; })()
this.option為聲明一個默認(rèn)參數(shù)。它的類型為對象,它里面放的就是用戶new時候傳入的參數(shù)。它的意義在于:組件里的參數(shù)一般分為必選與可選參數(shù),必選參數(shù)以用戶傳入的為準(zhǔn)。而可選參數(shù)要看用戶有沒有傳入,如果用戶傳了,那取用戶傳入的值;如果用戶沒有傳,那取組件里的默認(rèn)值。
在組件里,但凡要用到參數(shù)的地方,一律取this.option的值。再一開始的時候拿用戶傳入的參數(shù)config替換掉this.option。這樣既能保證用戶傳的參數(shù)能被組件使用到,并且能保證用戶沒有傳參的話,能用this.option里的值代替。
3、添加方法(function(){ class ImgLoader{ constructor(config){ //聲明一個默認(rèn)參數(shù) this.option={ resources:[], start:null, progress:null, complete:null, } if(config){ //走這里說明用戶傳參數(shù)了,那就拿用戶傳的覆蓋掉默認(rèn)的 for(let v in config){ this.option[v]=config[v] } }else{ //走這里說明用戶一個參數(shù)都沒有傳,那就給個警告 alert("參數(shù)錯誤!"); return; } this.total=this.option.resources.length||0; //加載的圖片總數(shù)(||運(yùn)算符是為了保證有個數(shù)值) this.currentIndex=0; //當(dāng)前正在加載的是哪一個圖片 } isFn(f){ //檢測用戶傳的事件是否為函數(shù) return typeof f==="function"; } start(){ for(let i=0;ithis.loaded(); img.onerror=()=>this.loaded(); img.src=this.option.resources[i]; } //先檢測用戶傳的start是否為函數(shù),是函數(shù)了就調(diào)用用戶傳的strar方法,并且把圖片總量當(dāng)作參數(shù)傳進(jìn)去 if(this.isFn(this.option.start)){ this.option.start(this.total); } } loaded(){ //當(dāng)一張圖片加載完成后,就會調(diào)用這個方法,也就代表現(xiàn)在加載成功了一張了 if(this.isFn(this.option.progress)){ //this.currentIndex++; this.option.progress(++this.currentIndex,this.total); } //所有圖片加載完成 if(this.currentIndex===this.total){ if(this.isFn(this.option.complete)){ this.option.complete(this.total); } } } } window.ImgLoader=ImgLoader; })()
isFn()方法是為了檢測用戶傳入的參數(shù)是否為function,因?yàn)?b>star、progress、complete三個參數(shù)是函數(shù),要求用戶傳入的必需為function類型。
start()為實(shí)例方法,該方法是映射用戶傳的start()參數(shù)。這個事件為加載前的事件,如何實(shí)現(xiàn)這個事件就需要用到Image對象身上的onload事件。如果用戶傳入的start()方法在onload事件發(fā)生前執(zhí)行,不就代表加載前的事件嗎?代碼中img的onload與onerror事件都指向了loaded方法,這里我并沒有對加載失敗做多帶帶處理,統(tǒng)一指向了加載成功后要執(zhí)行的函數(shù)。
loaded()為實(shí)例方法,該方法當(dāng)=img.onload發(fā)生時被調(diào)用,每一張圖片只要加載成功都會調(diào)用此方法,所以它映射的是用戶傳入的progress()參數(shù)。this.currentIndex代表現(xiàn)在已加載圖片的數(shù)量,在代碼中用了前自增運(yùn)算符,關(guān)于前自增與后自增的詳細(xì)用法請參考我的視頻課程。
用戶的參數(shù)里還有一個complete()參數(shù),這個參數(shù)代表的是所有圖片全部加載完成后觸發(fā)的事件。那如何判斷所有的圖片都加載完成了呢?關(guān)鍵的東西就是this.currentIndex,這個值在加載完成一張圖片后就會+1,那如果它的值==所有圖片的數(shù)量時就代表所有圖片都已經(jīng)加載成功了。
源碼下載
至此“再和“面向?qū)ο蟆闭剳賽邸?/strong>系列文章已經(jīng)全部更新完畢!寫文章不易,且行且珍惜!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96653.html
摘要:面向?qū)ο罄镒畲蟮奶攸c(diǎn)應(yīng)該就屬繼承了。在第二篇文章里說過原型實(shí)例跟構(gòu)造函數(shù)之間的繼承,并且還講了一道推算題。 通過上一篇文章想必各位老鐵已經(jīng)熟悉了class了,這篇文章接著介紹繼承。面向?qū)ο罄镒畲蟮奶攸c(diǎn)應(yīng)該就屬繼承了。一個項(xiàng)目可能需要不斷的迭代、完善、升級。那每一次的更新你是要重新寫呢,還是在原有的基礎(chǔ)上改吧改吧呢?當(dāng)然,不是缺心眼的人肯定都會在原來的基礎(chǔ)上改吧改吧,那這個改吧改吧就需要...
摘要:說到底面向?qū)ο蟛攀浅绦蛘Z言的根本。其實(shí)面向?qū)ο缶幊陶f的就是自定義對象。里并沒有類的概念,所以嚴(yán)格上來講這是個假的面向?qū)ο罄锏拿嫦驅(qū)ο缶幊态F(xiàn)在好了,終于聽到別人鄙視我們了,給我們提供了類這個概念,其實(shí)是向傳統(tǒng)語言更靠齊了。 通過前兩篇文章,我們了解了對象的概念以及面向?qū)ο罄锏南嚓P(guān)概念等知識,那前面說了對象分類里的前兩種,這篇文章要詳細(xì)去說第三種自定義對象,那真正的好戲這就來了! 面向?qū)ο?..
摘要:在上一篇文章里我介紹了一下面向?qū)ο缶幊痰母拍?,在最后終于喜出望外看到了提供了類的概念了。而到了里面真正的類與構(gòu)造函數(shù)現(xiàn)在是分離的,通過上面的代碼可以看出來,這種寫法正是面向?qū)ο蟮恼y(tǒng)寫法。 在上一篇文章里我介紹了一下面向?qū)ο缶幊痰母拍?,在最后終于喜出望外看到了ES6提供了類的概念了。那這個類如何去用,是這篇文章的主題。ES6給我們提供了一個class關(guān)鍵字。這個關(guān)鍵字跟以前的var l...
摘要:同時彈出的結(jié)果是指向了子類,又說明雖然調(diào)用的是父類的構(gòu)造函數(shù),但是調(diào)用完后會指向子類,指向也被改成了子類的實(shí)例。 在上一篇文章里介紹了繼承,那其中說過一個很關(guān)鍵的東西想要繼承子類里里必需先調(diào)用一個super方法。而super的作用絕對是價值連城!同時super的作用還有多種,并且跟你的使用環(huán)境有關(guān)系。 1、當(dāng)作函數(shù)使用 super被當(dāng)作函數(shù)使用,這種情況是最普遍的,上一篇文章里已經(jīng)使用...
摘要:所有的對象都是由構(gòu)造函數(shù)創(chuàng)建的對象哪來的構(gòu)造函數(shù)生的。而普通函數(shù)不能生成對象不孕不育,構(gòu)造函數(shù)可以生成對象有生育能力。別急,記住那句話永遠(yuǎn)指向?qū)嵗龑ο髮?yīng)的構(gòu)造函數(shù)的,那就先看實(shí)例對象是誰。 上一篇文章把對象的概念講解了一下,這篇文章要重點(diǎn)解釋最讓大家犯迷糊的一些概念,包括 構(gòu)造函數(shù) 實(shí)例 繼承 構(gòu)造函數(shù)的屬性與方法(私有屬性與方法) 實(shí)例的屬性與方法(共享屬性與方法) protot...
閱讀 2506·2021-11-25 09:43
閱讀 2620·2021-11-16 11:50
閱讀 3300·2021-10-09 09:44
閱讀 3207·2021-09-26 09:55
閱讀 2848·2019-08-30 13:50
閱讀 1034·2019-08-29 13:24
閱讀 2095·2019-08-26 11:44
閱讀 2806·2019-08-26 11:37