您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Javascript中函數(shù)作為對(duì)象的魅力”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Javascript中函數(shù)作為對(duì)象的魅力”這篇文章吧。
前言
Javascript賦予了函數(shù)非常多的特性,其中最重要的特性之一就是將函數(shù)作為第一型的對(duì)象。那就意味著在javascript中函數(shù)可以有屬性,可以有方法, 可以享有所有對(duì)象所擁有的特性。并且最重要的,她還可以直接被調(diào)用
我們簡(jiǎn)單的試驗(yàn)一下就可以發(fā)現(xiàn)
// 簡(jiǎn)單實(shí)驗(yàn) 函數(shù)作為對(duì)象的存在 let fn = function () {} fn.prop = 'fnProp' console.log(fn.prop) // fnProp
為函數(shù)添加屬性的這個(gè)特性我覺(jué)的大家在平時(shí)的開(kāi)發(fā)中基本沒(méi)什么嘗試或者是使用過(guò),但是在一些JS庫(kù)或者是事件回掉管理中都能發(fā)揮出很大的用處。下面一起來(lái)看幾個(gè)例子。
函數(shù)緩存
在某有一些的情況下我們可以要存儲(chǔ)一組相關(guān)但是相互又獨(dú)立的函數(shù)。這個(gè)需求看起來(lái)很easy,實(shí)現(xiàn)起來(lái)也不復(fù)雜。最顯而易見(jiàn)的做法是使用一個(gè)數(shù)組來(lái)保存所有的函數(shù),
這樣不是不可以,但是顯然這種做法不是最好的。下面通過(guò)為函數(shù)屬性我們呢來(lái)實(shí)現(xiàn)這個(gè)我們的目的
// 1:函數(shù)緩存示例 let store = { nextId: 1, // id cache: {}, // 緩存 add (fn) { // 如果函數(shù)中沒(méi)有id屬性那么就緩存 if (!fn.id) { console.log(`begin add func ${fn.name}`) fn.id = store.nextId ++ // 設(shè)置完緩存之后返回true return !!(store.cache[fn.id] = fn) } else { console.log(`${fn.name} is already in cache`) } } } function storeCache() {} store.add(storeCache) // begin add func storeCache store.add(storeCache) // storeCache is already in cache
上面的這一段代碼邏輯清晰,store對(duì)象用來(lái)管理我們的緩存,cache屬性用來(lái)存儲(chǔ)函數(shù),nextId屬性用來(lái)保存當(dāng)前的緩存Id,add()方法用來(lái)設(shè)置存儲(chǔ),先來(lái)判斷當(dāng)前函數(shù)是否已經(jīng)在緩存中然后再去設(shè)置緩存,這樣就能限制函數(shù)的重復(fù)添加,最后返回true。
!!構(gòu)造是一種可以將任意Javascript表達(dá)式轉(zhuǎn)化為其等效布爾值的簡(jiǎn)單方式。
緩存記憶函數(shù)
這種函數(shù)可以記住之前已經(jīng)計(jì)算過(guò)的結(jié)果,避免了不必要的計(jì)算,這顯然是能夠提升代碼性能的。
在舉例之前我們先來(lái)看看這種方式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
緩存了之前的結(jié)果,最終用戶享有性能優(yōu)勢(shì)
實(shí)際上是發(fā)生在幕后,操作無(wú)感
缺點(diǎn)
內(nèi)存的犧牲這是肯定的
打破了存粹性(一個(gè)函數(shù)或者方法應(yīng)該只做好一件事)
如果方法中有算法,那么很難測(cè)量這個(gè)算法的性能
了解了優(yōu)缺點(diǎn)我們來(lái)看一個(gè)簡(jiǎn)單的計(jì)算素?cái)?shù)的例子(不是很嚴(yán)謹(jǐn))
// 2: 緩存記憶函數(shù) function isPrime (value) { if (!isPrime.anwers) isPrime.anwers = {} // 先從緩存里面取 if (isPrime.anwers[value] != null ) { return isPrime.anwers[value] } // 開(kāi)始進(jìn)行判斷和計(jì)算 let prime = value != 1 for (let index = 2; index < value; index++) { if (value % index == 0) { prime = false break; } } // 保存計(jì)算出來(lái)的值 return isPrime.anwers[value] = prime } console.log(isPrime(5)) console.log(`從函數(shù)記憶中直接讀取${isPrime.anwers[5]}`)
這里呢 好處是特別明顯的我們?cè)俅蔚娜∮胕sPrime.anwers[5]的時(shí)候不需要經(jīng)過(guò)任何的計(jì)算,但是大型的計(jì)算要主要內(nèi)存的使用
緩存記憶DOM元素
通過(guò)元素的標(biāo)簽查詢DOM的操作的的代價(jià)是昂貴的,各位前端大佬肯定都很清楚。我們下面使用緩存記憶的方式來(lái)進(jìn)行這個(gè)操作
// 3:緩存記憶DOM元素 function getElements (name) { if (!getElements.cache) getElements.cache = {} return getElements.cache[name] = getElements.cache[name] || document.getElementsByTagName(name); } console.log(getElements('div')) // HTMLCollection console.log(getElements.cache['div']) // HTMLCollection
這個(gè)函數(shù)和上面的緩存使用的同一個(gè)手法,而且這簡(jiǎn)單的4句代碼能為我們的性能帶來(lái)大幅度的提升。這也算是一種超能力吧。函數(shù)的很多特性都和其上下文有關(guān),接下來(lái)我們研究一個(gè)和上下文又換的例子。
偽造數(shù)組方法(上下文相關(guān))
在一些情況下我們想創(chuàng)建一個(gè)包含一組數(shù)據(jù)的對(duì)象,但是這個(gè)數(shù)據(jù)包含很多的狀態(tài),比如和集合項(xiàng)有關(guān)的元數(shù)據(jù)那么我們用數(shù)組來(lái)存就不太合適了。那么這里我們就用對(duì)象的方式來(lái)假扮數(shù)組。通過(guò)改變上下文來(lái)完成一些“不法的行為”
// 4:偽造數(shù)組方法 // <input type="button" id="add" > // <input type="button" id="remove" > let elems = { length: 0, //為了保存?zhèn)€數(shù) add (elem) { Array.prototype.push.call(this, elem) }, gather (id) { this.add(document.getElementById(id)) } } elems.gather('add') elems.gather('remove') console.log(elems[0]); // <input type="button" id="add" > console.log(elems[1]); // <input type="button" id="remove" > console.log(elems.length); // 2 console.log(elems); /** 0: input#add 1: input#remove add: ? add(elem) gather: ? gather(id) length: 2 */
在我還對(duì)JS懵懵懂懂的時(shí)候看到這樣的操作被秀了一臉,簡(jiǎn)直是刺激了我幼小的心靈。
我們?cè)赼dd函數(shù)中實(shí)現(xiàn)了把元素添加到了集合中,而且Array又正好提供push方法, 不用白不用。這種操作也是直白的展示了函數(shù)上下文的超強(qiáng)特性。
以上是“Javascript中函數(shù)作為對(duì)象的魅力”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。