1、JavaScript 中的繼承 在 JavaScript 中實(shí)現(xiàn)繼承的方法是:將子類的 prototype 屬性設(shè)置為父類的對(duì)象。 例如,我有一個(gè) Basket 類,繼承 Hashtable 類:
如果不寫上面第二句,以后 typeof 一個(gè) Basket 的對(duì)象獲得的就是 Hashtable 了。 但是需要注意的是,由于所有的子類(Basket)的對(duì)象實(shí)例共享同一個(gè)原型對(duì)象(Hashtable),因此在父類對(duì)象的構(gòu)造函數(shù)中只能保存對(duì)所有子類對(duì)象均相同的實(shí)例變量。對(duì)每個(gè)子類不同的實(shí)例變量必須放在子類的的構(gòu)造函數(shù)中。很多時(shí)候父類對(duì)象沒(méi)有任何自己的實(shí)例變量,而只有一些方法,操作的是子類對(duì)象的實(shí)例變量。 2、JavaScript 中變量的作用域
alert 出來(lái)的是什么?你肯定會(huì)說(shuō)是 "aaa",錯(cuò),alert 出來(lái)的是 "undefined"。為什么? 因?yàn)?JavaScript 為了簡(jiǎn)化處理,變量實(shí)際上只有兩種作用域,全局變量和函數(shù)的內(nèi)部變量。你在函數(shù)內(nèi)部任何一個(gè)地方定義的變量其作用域都是整個(gè)函數(shù)體。而在 alert 的時(shí)候函數(shù)的內(nèi)部變量 v 已經(jīng)定義了,并且覆蓋掉了同名的全局變量 的定義,只是還沒(méi)有被初始化,所以 alert 出來(lái)的是 "undefined"。 3、undefined 和 null 有些開發(fā)人員誤以為在 JavaScript 中, return; 返回的就是 null,也就是 return null; 這是一個(gè)誤解,在 JavaScript 中, return; 返回的是 undefined,而不是 null。這兩個(gè)值是有區(qū)別的,請(qǐng)看《JavaScritp 權(quán)威指南》的相關(guān)內(nèi)容。最好明確地寫為: return null; 這個(gè)問(wèn)題同樣在傳遞參數(shù)時(shí)候也會(huì)出現(xiàn),例如:
alert 顯示 v2 的值是 undefined。 雖然在 JavaScript 中: undefined == null; 得到的結(jié)果是 true,將一個(gè) typeof 為 "undefined" 的標(biāo)識(shí)符與 null 做等值比較結(jié)果也是 true,似乎這兩個(gè)值可以混用。但是為了理解的清晰,最好還是把這兩個(gè)值區(qū)分開。 還有一個(gè)需要注意的是在 SP2 以前版本的 IE5 中,不能直接拿 undefined 與其它值比較,例如:
在 SP3 以上版本的 IE5、IE6 都沒(méi)問(wèn)題,但是在 SP2 版本前的 IE5 中無(wú)法執(zhí)行。必須要寫成:
你可能想當(dāng)然地認(rèn)為 f1 就是這個(gè)方法的名稱。你想錯(cuò)了,f1 只是這個(gè)類的對(duì)象的一個(gè)普通屬性而已,它的值可以是任何類型。這個(gè)方法是匿名的,在全局名字空間中并沒(méi)有它的標(biāo)識(shí)符。如果想在全局名字空間獲得一個(gè)標(biāo)識(shí)符,你應(yīng)該采用如下兩種方式:
或者
5、重載父類的方法后如何調(diào)用父類的方法?
且慢,如果我還想調(diào)用父類的方法怎么辦呢?不必?fù)?dān)心,
這里加的一句就是調(diào)用父類的 f1 方法。apply 換成 call 也是可以的。 不過(guò) JS 因?yàn)楹瘮?shù)參數(shù)數(shù)量是可變的,所以它并不會(huì)把 function f1 (arg1, arg2, arg3) 和 function f1 () 看做是兩個(gè)函數(shù),它會(huì)認(rèn)為它們就是一個(gè)函數(shù)(小子,換了個(gè)馬甲就以為我認(rèn)不出你了?),后面出現(xiàn)的定義會(huì)覆蓋前面的定義。所以即使你改變子類方法的簽名,它仍然認(rèn)為是重載了父類同名的方法。 那么如果我還想調(diào)用父類的構(gòu)造函數(shù)怎么辦呢?這樣做:
JavaScript 也是可以做自動(dòng)測(cè)試的。xUnit 框架在 JS 領(lǐng)域的嫡系傳人是 JsUnit(http://jsunit.),基本上就是 JUnit 的 JS 版,連例子都是從 JUnit 的例子移植過(guò)來(lái)的。 如何用 TDD 方式做 JS 開發(fā)?這個(gè)話題可就大了,足夠說(shuō)上幾天的,以后我會(huì)另開主題討論這個(gè)問(wèn)題。 |
|