JavaScript中的常見繼承總結(jié)
前言
我們在學習前端的過程中一定會遇到繼承這個問題
繼承其實就是構(gòu)造函數(shù)和構(gòu)造函數(shù)之間的一種關(guān)系
當一個構(gòu)造函數(shù)A的實例使用構(gòu)造函數(shù)B身上的屬性和方法,這個時候我們就說構(gòu)造函數(shù)A繼承至構(gòu)造函數(shù)B。
我們一般把構(gòu)造函數(shù)A稱之為子類,構(gòu)造函數(shù)B稱之為父類。
想要弄明白繼承就要先弄明白原型鏈
原型鏈

function Person() {
// 屬性
this.name = 'Jack'
this.age = 18
this.gender = '男'
}
// 實例
const p = new Person()
// 1.p 的 __proto__ 指向了誰?
console.log(p.__proto__ === Person.prototype)
// 2.Person 的 __proto__ 指向了誰 ?
console.log(Person.__proto__ === Function.prototype)
// 3.Person.prototpye 的 __proto__ 指向了誰 ?
console.log(Person.prototype.__proto__ === Object.prototype)
// 4.Function.prototype 的 __proto__ 指向了誰 ?
console.log(Function.prototype.__proto__ === Object.prototype)
// 5.Function 的 __proto__ 指向了誰 ?
console.log(Object.prototype.__proto__)
// 6.Object.prototype 的 __proto__ 指向了誰 ?
console.log(Function.__proto__ === Function.prototype)
// 7.Object 的 __proto__ 指向了誰 ?
console.log(Object.__proto__ === Function.prototype)常用的繼承方法
我們在面試或者開發(fā)過程中使用做多的繼承有:
- 原型繼承
- 原型鏈繼承
- 組合繼承
當然還有一些別的繼承,其它的繼承相對于上面的三種情況使用的就少了很多:
主要介紹上面的三種繼承
原型繼承
原理
- 原型繼承的核心原理:子類的原型指向父類的實例
- 這個也可以理解成把父類的實例賦值給子類的原型對象
優(yōu)點
- 父類構(gòu)造函數(shù)體內(nèi)的屬性和原型上的方法都可以實現(xiàn)繼承
缺點
- 繼承下來的屬性不在自己身上, 在自己的原型上
- 一個構(gòu)造函數(shù)的實例, 需要在兩個地方傳遞參數(shù)
- 所有子類的實例, name 和 age 一模一樣
? ? ? ?// 父類
? ? ? ?function Person(name, age) {
? ? ? ? ? ?//屬性
? ? ? ? ? ?this.name = name
? ? ? ? ? ?this.age = age
? ? ? }
// 方法
? ? ? ?Person.prototype.paly = function () { console.log('玩游戲'); }
?
? ? ? ?// 子類
? ? ? ?function Students(classRoom) {
? ? ? ? ? ?// 屬性
? ? ? ? ? ?this.classRoom = classRoom
? ? ? }
?
? ? ? ?// 把子類的原型指向父類的實例對象
? ? ? ?// 把父類的實例賦值給子類的原型(原型對象)
? ? ? ?// 創(chuàng)建一個父類的實例
? ? ? ?const p = new Person('Jack', 25)
? ? ? ?// 子類的實例指向父類的原型對象
? ? ? ?Students.prototype = p
?
? ? ? // 實例化一個對象
? ? ? let s = new Students('高級1班')
? ? ? console.log(s);
? ? ? let s1 = new Students('高級2班')
? ? ? console.log(s1);執(zhí)行結(jié)果

借用構(gòu)造函數(shù)繼承
原理
- 把我們的父類夠構(gòu)造函數(shù)當做普通函數(shù)在子類構(gòu)造函數(shù)體內(nèi)調(diào)用
- 利用 call 方法改變函數(shù)內(nèi)的 this 指向
優(yōu)點
- 子類的所有繼承下來的屬性都在自己身上
- 子類的所有參數(shù)在一個地方傳遞
- 子類的所有實例都可以給繼承下來的屬性賦不一樣的值
缺點
父類的原型上的方法沒有繼承下來:
// 父類
function Person(name, age) {
// 屬性
this.name = name
this.age = age
}
// 原型對象上添加一個方法
Person.prototype.paly = function () { console.log('玩游戲'); }
// 子類
function Students(name, age,classRoom) {
this.classRoom = classRoom
// 因為這個this指向的就是子類的實例
Person.call(this, name, age)
}
// 實例化一個對象
let s = new Students('張三',25,'高級1班')
console.log(s);
let s1 = new Students('李四',20,'高級2班')
console.log(s1);執(zhí)行結(jié)果

組合繼承
原理
- 把 原型繼承 和 借用構(gòu)造函數(shù) 繼承放在一起使用
優(yōu)點
- 把原型繼承 和 借用構(gòu)造函數(shù)繼承放在一起使用
- 既達到了全都繼承下來又能把屬性繼承在自己身上
缺點
子類的原型上有一套多余的屬性:
// 父類
function Person(name, age) {
? ?// 屬性
? ?this.name = name
? ?this.age = age
}
// 原型對象上添加一個方法
Person.prototype.paly = function () { console.log('玩游戲'); }
// 子類
function Students(name, age,classRoom) {
? ?this.classRoom = classRoom
? ?// 借用構(gòu)造函數(shù)繼承
? ?Person.call(this, name, age)
}
// 原型繼承
// 主要的目的就是為了使用父類身上的方法
Students.prototype = new Person()
?
// 實例化一個對象
let s = new Students('張三',25,'高級1班')
console.log(s);
?
let s1 = new Students('王五',24,'高級2班')
console.log(s1);
s1.play()執(zhí)行結(jié)果

到此這篇關(guān)于JavaScript中的常見繼承總結(jié)的文章就介紹到這了,更多相關(guān)JS常見繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript實現(xiàn)數(shù)字驗證碼的簡單實例
本篇文章主要是對javascript實現(xiàn)數(shù)字驗證碼的簡單實例進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02
微信小程序?qū)崿F(xiàn)定位及到指定位置導航的示例代碼
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)定位及到指定位置導航的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
JS組件封裝之監(jiān)聽localStorage的變化
這篇文章主要介紹了JS組件封裝之監(jiān)聽localStorage的變化,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09

