Javascript 語言的多態

多態的實際含義是,同一操做,做用在不一樣的對象上面,能夠產生不一樣的解釋和不一樣的執行結果。
javascript的變量類型在運行期是可變的,這就意味着javascript對象的多態性是與生俱來的。javascript

Java語言是一門靜態類型的語言,因爲在代碼編譯時要進行嚴格的類型檢查,因此不能給變量賦予不一樣類型的值,這種類型檢查就會使代碼變得僵硬,可是java也能夠經過繼承獲得多態的效果(實現繼承和接口繼承) 能夠向上轉型來實現多態。java

下面一張圖來解釋:函數

主人同時向雞和鴨兩個對象發出指令 "發出叫聲", 雞和鴨同時發出叫聲,可是他們的叫聲是不同的。
圖片描述編碼

咱們用代碼來演示這個例子:spa

傳統的代碼咱們習慣用 if else 來堆砌硬編碼代碼,可是若是這個對象一直往上加就會形成不斷的加代碼,修改代碼老是很危險的,修改的地方越多,程序出錯的可能性就會越大,並且當動物的類型越多的時候就會形成if else 堆砌成了一個巨大的函數,不利於維護。prototype

var makeSound = function(animal) {
     if (animal instanceof Dog) {
        console.log('wanwan');
     } else if(animal instanceof Cat) {
        console.log('miaomiao');
     }
}

var Dog = function() {}
var Cat = function() {}
makeSound(new Dog());
makeSound(new Cat());

修改以後的代碼以下:code

var makeSound = function(animal) {
     animal.sound();
}
var Dog = function() {}
Dog.prototype.sound = function(){
   console.log('wanwan');
}

var Cat = function() {}
Cat.prototype.sound = function() {
   console.log('miaomiao');
}
makeSound(new Dog());
makeSound(new Cat());

如何理解若是對象沒法響應某個請求,它會把這個請求委託給它的構造器的原型,這條原則是原型繼承的精髓所在,下面有這樣的一段代碼:對象

var obj = {name:'lin'};繼承

var A = function() {};接口

A.prototype = obj;

var a = new A();
console.log(a.name);

解釋:遍歷對象a全部的屬性,沒有找到name這個屬性查找name屬性的這個請求被委託給對象a的構造器的原型,它被a._proto_記錄而且指向A.prototype,而A.prototype被設置爲對象obj在對象obj中找到name屬性,而且返回

相關文章
相關標籤/搜索