面向?qū)ο?五)
多態(tài)
我仔細(xì)看了一下兽狭,這里說(shuō)的JavaScript 的多態(tài)好像和Java的多態(tài)不一樣,
- Java 的多態(tài)講的是類的繼承素挽,父類實(shí)例指向子類對(duì)象捌肴,父類方法的重寫
- JavaScript的多態(tài)是一個(gè)方法多種調(diào)用方式
還是有一些不同, 上代碼
// 多態(tài)
function add() {
// 獲取參數(shù)
let arg = arguments
// 獲取參數(shù)長(zhǎng)度
let len = arg.length
switch(len) {
// 如果沒(méi)有參數(shù)
case 0:
return 10;
// 如果只有一個(gè)參數(shù)
case 1:
return 10 + arg[0]
// 如果有兩個(gè)參數(shù)
case 2:
return arg[0] + arg[1]
}
}
// 測(cè)試用例
console.log(add()) // 10
console.log(add(5)) // 15
console.log(add(6, 7)) // 13
另一種更易懂的形式(更像面向?qū)ο蟮姆绞?
function Add(){
// 無(wú)參數(shù)算法
function zero() {
return 10
}
// 一個(gè)參數(shù)的算法
function one(num) {
return 10+num
}
// 兩個(gè)參數(shù)的算法
function two(num1, num2){
return num1+num2
}
this.add = function() {
let arg = arguments
let len = arg.length
switch(len) {
case 0:
return zero()
case 1:
return one(arg[0])
case 2:
return two(arg[0], arg[1])
}
}
}
// 實(shí)例化類
let A = new Add()
// 測(cè)試
console.log(A.add()) // 10
console.log(A.add(5)) // 15
console.log(A.add(6, 7)) // 13
總結(jié)一下(這里的能稍微看看就行)
在JavaScript中
封裝
- 封裝與集成是面向?qū)ο笾械膬蓚€(gè)主要特性,繼承即是對(duì)原有對(duì)象的封裝,從中創(chuàng)建私有屬性捺檬,私有方法再层,特權(quán)方法,共有屬性堡纬,共有方法等聂受。
- 有的不論對(duì)類如何實(shí)例化,它只創(chuàng)建一次烤镐,這類屬性或方法我們稱之為靜態(tài)的
- 只被類所擁有的屬性和方法是靜態(tài)類屬性和靜態(tài)類方法 (這段有點(diǎn)沒(méi)說(shuō)清楚)
- 可以被繼承的的方法與屬性 一類是在構(gòu)造函數(shù)中蛋济,這類屬性與方法在對(duì)象實(shí)例化時(shí) 被復(fù)制一遍
- 另一類在類的原型對(duì)象中,這類屬性與方法在對(duì)象實(shí)例化時(shí)被所有實(shí)例化對(duì)象所共用
繼承
如果實(shí)例化的是對(duì)象炮叶,那么則為對(duì)象繼承 (這個(gè)說(shuō)法真飄逸= =)
如果實(shí)例化的是類(當(dāng)然累也是一種對(duì)象碗旅,只不過(guò)是用來(lái)創(chuàng)建對(duì)象的), 那么就是一種類的繼承
通過(guò)原型鏈繼承的方式我們稱之為類式繼承
通過(guò)構(gòu)造函數(shù)繼承的方式我們稱之為構(gòu)造函數(shù)式繼承
這兩種方式組合起來(lái)的方式我們稱之為組合式繼承
由于類式繼承過(guò)程中會(huì)實(shí)例化父類渡处,這樣如果父類構(gòu)造函數(shù)極其復(fù)雜,那么這種方式對(duì)構(gòu)造函數(shù)的開(kāi)銷是不值得的祟辟,所以有了一種新的繼承方式医瘫,通過(guò)在一個(gè)函數(shù)內(nèi)的過(guò)度對(duì)象實(shí)現(xiàn)繼承并返回新對(duì)象的方式,我們稱之為寄生式繼承
我們?cè)俳Y(jié)合構(gòu)造函數(shù)式繼承川尖,這樣再融合構(gòu)造函數(shù)繼承中的有點(diǎn)并去除其缺點(diǎn)登下,得到的繼承方式就是 寄生組合式繼承,
有時(shí)候子類對(duì)父類實(shí)現(xiàn)繼承可以通過(guò)拷貝方法與屬性的方式來(lái)實(shí)現(xiàn)叮喳,這就有了多繼承被芳,即將多個(gè)父類(對(duì)象)的屬性與方法拷貝給子類實(shí)現(xiàn)繼承
這里的JavaScript的多態(tài),通過(guò)對(duì)傳遞參數(shù)判斷來(lái)決定執(zhí)行邏輯馍悟,可以實(shí)現(xiàn)一種多態(tài)處理機(jī)制(和Java不太一樣)
面向?qū)ο蠡A(chǔ)就暫時(shí)這樣了畔濒,后面就開(kāi)始正式的面向?qū)ο蟮膶?shí)戰(zhàn)應(yīng)用,設(shè)計(jì)模式了...