多態的實際含義是,同一操做,做用在不一樣的對象上面,能夠產生不一樣的解釋和不一樣的執行結果。
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屬性,而且返回