javascript的類與繼承
javascript的類與一般的面向?qū)ο笳Z言有很大的不同,類的標(biāo)識是它的構(gòu)造函數(shù),下面先定義一個(gè)類
var User=function(name){
this.name=name;
};
User.getName=function(){return this.name;};
User.prototype.get_name=function(){return this.name};
user1=new User('kkk');
user2=new User('jjj');
user1.getName=function(){console.log('hello');};
user1.get_name=function(){console.log('hello');};
顯然我們可以看出這兩個(gè)函數(shù)是不同的,雖然它們實(shí)現(xiàn)了相同的功能。
接下來我們先解釋構(gòu)造函數(shù),當(dāng)我們使用new操作符生成對象時(shí),對象在進(jìn)入函數(shù)之前就已經(jīng)存在了,構(gòu)造函數(shù)所完成的僅僅是初始化的工作。
每個(gè)javascript的函數(shù)都生而具有prototype這一屬性,它們的new 與prototype.constructor有關(guān)。有以下關(guān)系存在:
User.prototype.constructor===User
true
同時(shí)類的靜態(tài)方法如getName并不是一種值得推薦的方法,因?yàn)閷τ诿恳粋€(gè)被創(chuàng)建的對象都會創(chuàng)建相應(yīng)的函數(shù)對象,方法在這里與其他的屬性并無任何不一致之處。
通過工廠方法創(chuàng)建類
var User=function(name){
var user;
user.name=name;
user.getName=function(name){return user.name;};
return user;
}();
通過工廠方法可以直接創(chuàng)建繼承了原型方法的對象,但是這樣得到的問題在于沒有prototype屬性,需要手動(dòng)添加,不推薦這種方法。
下面開始講繼承的方法,先給出一種示例
function Vip(name,level){
this.name=name;
this.level=level;
}
Vip.prototype=User;
alert(Vip.prototype.construtor===Vip);//false
這樣顯然不行,對子類的任何方法的改變都會導(dǎo)致父類的方法改變,更嚴(yán)重的是繼承鏈遭到破壞。
利用構(gòu)造函數(shù)來繼承
function Vip(name,level){
User.call(this,name);
this.level=level
}
User.prototype.hehe=function(){console.log('hehe');};
(new Vip('kf',2)).hehe();//error!
上面的方法子類顯然無法繼承父類的原型函數(shù),這樣不符合我們使用繼承的目的。
function Vip(name,level){
this.name=name;
this.level=level;
}
Vip.prototype=new User();
Vip.prototype.constructor=Vip;
這是一種折衷的繼承方式,本質(zhì)上把子類的所有對象綁定到父類的一個(gè)對象上,子類原型方法就是這個(gè)對象的一個(gè)屬性。