
什么是繼承
根據(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 屬性,可以稱為繼承。
- 使用 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,由于是語法糖因而自然寫法簡便,但其有一定局限性。