??? 實現(xiàn)JavaScript繼承的最簡單的方式是call方法(或者apply方法)及原型鏈方法,但這兩種方法都有缺陷,而其混合體就是很好的繼承實現(xiàn)方式。下面舉例說明:
??? 除了這個最經(jīng)典的實現(xiàn)繼承的方式外,目前還有一些免費的庫可供使用。但想到形形色色的庫,頭就大了,有時間有必要時再研究吧!
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及函數(shù)屬性sayAge,sayAge方法的定義采用的是原型方式。Dog類要繼承Animal,其字段屬性除了age外還有name,通過Animal.call(this,age);可以實現(xiàn)Dog繼承Animal的字段屬性age并將其初始化了。call方法的第一個參數(shù)為繼承的類的this指針,第二個參數(shù)為Animal類的構(gòu)造函數(shù)的參數(shù)。實際上,只是通過call方法就可以實現(xiàn)繼承,但唯一的要求是父類的函數(shù)屬性要在構(gòu)造函數(shù)中定義,這對于這里的函數(shù)屬性使用原型方式定義來說就不適合了(采用原型方式定義函數(shù)屬性比在構(gòu)造函數(shù)內(nèi)定義更直觀一些)。要想繼承Animal的原型方式定義的函數(shù)屬性,需要的語句就是“Dog.prototype?=?new?Animal();”。而Dog類中的sayName()函數(shù)則是其自身的函數(shù)屬性了。????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();
??? 除了這個最經(jīng)典的實現(xiàn)繼承的方式外,目前還有一些免費的庫可供使用。但想到形形色色的庫,頭就大了,有時間有必要時再研究吧!