javascript的類與繼承

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è)屬性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 博客內(nèi)容:什么是面向?qū)ο鬄槭裁匆嫦驅(qū)ο竺嫦驅(qū)ο缶幊痰奶匦院驮瓌t理解對象屬性創(chuàng)建對象繼承 什么是面向?qū)ο?面向?qū)ο?..
    _Dot912閱讀 1,536評論 3 12
  • 1、構(gòu)造函數(shù)模式 [url=]file:///C:/Users/i037145/AppData/Local/Tem...
    橫沖直撞666閱讀 927評論 0 0
  • 本章內(nèi)容 理解對象屬性 理解并創(chuàng)建對象 理解繼承 面向?qū)ο笳Z言有一個(gè)標(biāo)志,那就是它們都有類的概念,而通過類可以創(chuàng)建...
    悶油瓶小張閱讀 963評論 0 1
  • 本文先對es6發(fā)布之前javascript各種繼承實(shí)現(xiàn)方式進(jìn)行深入的分析比較,然后再介紹es6中對類繼承的支持以及...
    lazydu閱讀 16,825評論 7 44
  • 《島》是英國作家維多利亞·希斯洛普(Victoria Hislop)第一部長篇小說?!秿u》講述的故事與麻風(fēng)病有關(guān),...
    道理斯貝閱讀 1,676評論 0 0

友情鏈接更多精彩內(nèi)容