js根据name获取value_js 函数的重载
js 函數(shù)的重載
我們知道,很多編程語言都有函數(shù)的重載。
所謂的重載,看定義:
重載,簡單說,就是函數(shù)或者方法有相同的名稱,但是參數(shù)列表不相同的情形,這樣的同名不同參數(shù)的函數(shù)或者方法之間,互相稱之為重載函數(shù)或者方法。同名函數(shù),根據(jù)傳入的參數(shù)類型不同,來執(zhí)行對應(yīng)的方法。
所以從這個(gè)定義中,我們能夠得出,js 并不具備函數(shù)的重載功能。
因?yàn)?js 不用對傳入的參數(shù)的類型,進(jìn)行嚴(yán)格的定義。所以,即使我們寫了同名的函數(shù),也只會(huì)導(dǎo)致后面的函數(shù)會(huì)將前面的函數(shù)覆蓋掉。
現(xiàn)在我們假設(shè),即使 js 同名函數(shù)能夠共存,但是我們無法知道不同的同名函數(shù)分別接收什么類型的參數(shù),同樣無法判斷該調(diào)用哪一個(gè)方法。
但是我們在平時(shí)寫代碼的過程中,有一種情況是比較常見的。
比如,我們現(xiàn)在有一個(gè)對象 People,有私有屬性 name 和 age。
因?yàn)?JavaScript 中沒有私有屬性,所以我們只能通過閉包來模擬私有屬性。
所以,我們在構(gòu)造函數(shù)內(nèi)部定義 name 和 age 對象,通過 get,set 接口來統(tǒng)一讀取和修改他們。
代碼見下面所示。
var用的時(shí)候,我們可以這樣:
// 防止構(gòu)造函數(shù)中沒用 new 我們檢測了一下 this 的指向可以看到,這里,我們通過用了 get 和 set 函數(shù),來對外提供接口。
那么,我們想一想,我們能不能將這兩個(gè)函數(shù)合并一下,通過同一個(gè)函數(shù),來實(shí)現(xiàn)這兩種功能呢?
答案當(dāng)然是肯定的,我么可以改寫一下我們之前的構(gòu)造函數(shù):
var再看下我們的使用過程:
var可以看出來,這樣一改,這個(gè)接口調(diào)用起來就很方便了。
雖然乍一看,這樣該寫了以后,好像不太好理解。但是如果習(xí)慣了這種寫法以后,你會(huì)感受到這種寫法的奇妙之處。簡直太方便了,傳一個(gè)參數(shù)就是拿值,傳兩個(gè)參數(shù),就是改寫對應(yīng)的值。
當(dāng)然這種寫法,是我們在架構(gòu)我們的項(xiàng)目的時(shí)候,有這種意識(shí),這當(dāng)然算是一種比較好的寫法了。
但是如果我們剛開始架構(gòu)的時(shí)候,是這樣寫的:
var隨著我們項(xiàng)目的進(jìn)行,可能在原型鏈上,有很多方法都用到了 this._name 或者 this._age。
這個(gè)時(shí)候,如果想要遷移我們的變量成閉包內(nèi)部的變量,當(dāng)然是不劃算的,改寫起來太麻煩了。
但是如果我們又想要提供一個(gè)類似于之前的 o 函數(shù),該怎么做呢?
也許又童鞋得第一反應(yīng)是,這還不簡單,三下五除二的進(jìn)行了如下的拓展:
People這樣寫固然沒有問題,但是還是不太具備擴(kuò)展性。
如果,某一天,我們突發(fā)奇想,想要拓展一下這個(gè) o 方法,當(dāng)不傳參數(shù)的時(shí)候,我們想要列出實(shí)例上所有的屬性。
我們固然可以通過重載這個(gè) o 方法來實(shí)現(xiàn),但是總感覺不夠優(yōu)雅。
現(xiàn)在有一種更為優(yōu)雅的方式。
我們可以創(chuàng)建一個(gè) overload 方法用于重載:
function我們可以這樣調(diào)用:
overload我們還可以繼續(xù)擴(kuò)展:
overload可以看出來,我們的重載函數(shù),非常的強(qiáng)大,擴(kuò)展性也是非常的強(qiáng)。
可以對任意一個(gè)對象上的函數(shù)進(jìn)行重載,當(dāng)然這里是通過識(shí)別參數(shù)的個(gè)數(shù)來進(jìn)行重載的,這也是現(xiàn)階段 js 中所能做到的極限了。
這個(gè)小小的 overload 方法,同樣也是通過閉包來實(shí)現(xiàn)的重載。
原理就是通過比較函數(shù)的參數(shù)與傳入的參數(shù)個(gè)數(shù)是否相等,相等則用調(diào)用當(dāng)前函數(shù)進(jìn)行執(zhí)行。如果不相等,那么調(diào)用 old 函數(shù),進(jìn)行執(zhí)行。而 old 函數(shù)同樣會(huì)遞歸執(zhí)行參數(shù)個(gè)數(shù)判斷這一過程,這樣就實(shí)現(xiàn)了根據(jù)參數(shù)的個(gè)數(shù)對函數(shù)進(jìn)行重載。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的js根据name获取value_js 函数的重载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机论文答辩2分钟演讲稿,毕业答辩发言
- 下一篇: java序列化流_java 序列化流与反