本章是介紹了實用call方法結合原型鏈方法來實現javascript繼承的最佳方式,非常的實用,有需要的小伙伴可以參考下。
實作JavaScript繼承的最簡單的方式是call方法(或apply方法)及原型鏈方法,但這兩種方法都有缺陷,而其混合體就是很好的繼承實作方式。以下舉例說明:
function Animal(age){ this.age = age; } Animal.prototype.sayAge = function(){ window.alert("My age is "+this.age+"!"); }; function Dog(age,name){ Animal.call(this,age); this.name = name; } Dog.prototype = new Animal(); Dog.prototype.sayName = function(){ window.alert("I am a "+this.name+"!"); }; var dog = new Dog(15,"dog"); dog.sayName(); dog.sayAge();
對於類別Animal來說,它有一個字段屬性age及函數屬性sayAge,sayAge方法的定義採用的是原型方式。 Dog類別要繼承Animal,其欄位屬性除了age外還有name,透過Animal.call(this,age);可以實作Dog繼承Animal的欄位屬性age並將其初始化了。 call方法的第一個參數為繼承的類別的this指針,第二個參數為Animal類別的建構子的參數。實際上,只是透過call方法就可以實現繼承,但唯一的要求是父類別的函數屬性要在建構函式中定義,這對於這裡的函式屬性使用原型方式定義來說就不適合了(採用原型方式定義函數屬性比在建構函數內定義更直觀一些)。要繼承Animal的原型方式定義的函數屬性,需要的語句就是「Dog.prototype = new Animal();」。而Dog類別中的sayName()函數則是其自身的函數屬性了。
除了這個最經典的實現繼承的方式外,目前還有一些免費的庫可供使用。但想到形形色色的庫,頭就大了,有時間有必要時再研究吧!