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