JS 中繼承的寫法

什么是繼承

繼承(英語:inheritance)是面向?qū)ο?/a>軟件技術(shù)當(dāng)中的一個概念。如果一個類別B“繼承自”另一個類別A,就把這個B稱為“A的子類”,而把A稱為“B的父類別”也可以稱“A是B的超類”。繼承可以使得子類具有父類別的各種屬性和方法,而不需要再次編寫相同的代碼。在令子類別繼承父類別的同時,可以重新定義某些屬性,并重寫某些方法,即覆蓋父類別的原有屬性和方法,使其獲得與父類別不同的功能。另外,為子類追加新的屬性和方法也是常見的做法。 一般靜態(tài)的面向?qū)ο缶幊陶Z言,繼承屬于靜態(tài)的,意即在子類的行為在編譯期就已經(jīng)決定,無法在運行期擴(kuò)展。

根據(jù)維基百科解釋,可以簡單概括為:
繼承是類與類之間的關(guān)系,其作用是使得子類具有父類別的各種屬性和方法。


JS 里的原型繼承模型

js是一門動態(tài)語言,js沒有類的概念,ES6 新增了class 關(guān)鍵字,但只是語法糖,JavaScript 仍舊是基于原型。

至于繼承,js的繼承與java這種傳統(tǒng)的繼承不一樣.js是基于原型鏈的繼承. 兩次的原型搜索就是繼承。
數(shù)組 a 從 Array 中原型搜索到 toString 屬性,只是實例屬性;a 從 Array 中原型搜索到 (Array 從 Object 中原型搜索到的)valueOf 屬性,可以稱為繼承。

  1. 使用 prototype 實現(xiàn)繼承
    prototype 的作用:為構(gòu)造函數(shù)內(nèi)添加實例對象之間的共有屬性

明確 JS 內(nèi)的繼承
以下面代碼為例

// 構(gòu)造一個 人類
function Human(name){
  this.name = name
}
// 給所有 人類 添加一個 跑 的共有屬性
Human.prototype.run = function(){
  console.log("my name is "+this.name+",i'm running")
  return undefined
}
// 構(gòu)造一個 男人類
function Man(name){
  Human.call(this, name)
  this.gender = 'man'
}
// 所有 男人 都有好戰(zhàn)屬性
Man.prototype.fight = function(){
  console.log('fight')
}
prototype

可以看到名為 hzl 的人只有 Man 構(gòu)造函數(shù)里面含有的屬性,而沒有我們希望的 Human 應(yīng)該有的 run 的屬性。
目標(biāo):假如我們有方法讓 hzl 有了 Man 里面沒有的 run 屬性,即我們自己實現(xiàn)了 Man 繼承 Human 的過程。

var a = function(){}
a.prototype = Human.prototype
Man.prototype = new a()
prototype2

可以看到 hhh 繼承了來自 Human 的 run 屬性

2. ES6 實現(xiàn)繼承

上面代碼的 ES6 版本

// ES6 寫法
class Human{
     constructor(name){
         this.name = name
     }
     run(){
         console.log("my name is"+this.name+",i'm running")
         return undefined
     }
 }
 class Man extends Human{ // extends 實現(xiàn)上述繼承過程
     constructor(name){
         super(name) // 調(diào)用構(gòu)造函數(shù):'超類'
         this.gender = 'man'
     }
     fight(){
         console.log('fight')
     }
 }

ES6 的 class 是語法糖,其實質(zhì)就是函數(shù),而上述用 class 實現(xiàn)繼承的過程,還是基于原型鏈的, 只是更加方便我們使用繼承的方法


總結(jié):

JS 繼承的原型寫法相對 ES6 的寫法看上去更復(fù)雜,class 的寫法更符合面向?qū)ο缶幊痰乃季S,由于是語法糖因而自然寫法簡便,但其有一定局限性。

參考資料:

MDN繼承與原型鏈
Class 的繼承

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

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

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