JavaScript中常見的幾種繼承方式
原型繼承
function Parent(name) {
this.name = name
}
Parent.prototype.getName = function(){
return 'parentPrototype' + ' ' + this.name;
}
function Son() {
}
Son.prototype = new Parent();
console.log(new Son())內(nèi)存圖


分析
原型繼承的原理就是把子類的prototype指向父類的實(shí)例身上,這樣做,子類就可以使用父類的屬性和方法了,但是,無(wú)法初始化父類的屬性,這個(gè)時(shí)候,盜用構(gòu)造函數(shù)繼承就出現(xiàn)了
盜用構(gòu)造函數(shù)繼承
function Parent(name) {
this.name = name
}
Parent.prototype.getName = function(){
return 'parentPrototype' + ' ' + this.name;
}
function Son(name) {
Parent.call(this, name)
}
console.log(new Son('jack'))
分析

盜用構(gòu)造函數(shù)的原理簡(jiǎn)單理解就是吧父類函數(shù)的代碼 copy 到子類里面,在上述代碼中相當(dāng)于把父類的this.name = name 在子類里執(zhí)行了一次,這樣的話,就可以在子類實(shí)例化的時(shí)候初始化父類的一些屬性
如果這樣的話就取不到父類原型身上的方法了,為了解決這個(gè)問(wèn)題,組合繼承就出現(xiàn)了
組合繼承
function Parent(name) {
this.name = name
}
Parent.prototype.getName = function(){
return 'parentPrototype' + ' ' + this.name;
}
function Son(name) {
Parent.call(this, name) // 第二次調(diào)用
}
Son.prototype = new Parent() // 第一次調(diào)用
console.log(new Son('jack'))組合繼承,也稱為偽經(jīng)典繼承,結(jié)合了原型繼承和盜用構(gòu)造函數(shù)繼承,既可以初始化父類的方法,又可以取到父類的原型身上的方法

可以看到這種繼承方式name會(huì)被多次創(chuàng)建,雖然在使用上沒(méi)什么區(qū)別,但是會(huì)多開辟一些無(wú)用內(nèi)存,而且還會(huì)多調(diào)用一次函數(shù)
原型鏈繼承
const parent = {
name: 'jack',
getName() {
return this.name
}
}
const son = Object.create(parent)
console.log(son)這種繼承適用于想在一個(gè)對(duì)象的基礎(chǔ)上添加一個(gè)新的對(duì)象,這個(gè)新的對(duì)象可以有自己獨(dú)立的屬性

還可以有自己的屬性:
const parent = {
name: 'jack',
getName() {
return this.name
}
}
const son = Object.create(parent, {
age: {
value: 18,
enumerable: true,
writable: true,
configurable: true
}
})
console.log(son)
寄生式繼承
const parent = {
name: 'jack',
getName() {
return this.name
}
}
function createObj(origin){
const res = Object(origin);
res.age = 18;
res.getAge = function() {
return this.age
};
return res
}
const son = createObj(parent)
console.log(son)
寄生式繼承就是類似于工廠模式,經(jīng)過(guò)它創(chuàng)建的函數(shù),會(huì)有一些自帶的值
寄生組合式繼承
function Parent(name) {
this.name = name;
}
Parent.prototype.getName = function () {
return this.name;
}
function Son(name) {
Parent.call(this, name)
};
function inhertPrototype(Son, Parent) {
const res = Object(Parent.prototype); // 創(chuàng)建目標(biāo)對(duì)象的原型對(duì)象
// 可以理解為復(fù)制父類對(duì)象prototype的屬性,這樣做可以少調(diào)用一次父類的實(shí)例化操作
res.constructor = Son // 將構(gòu)造函數(shù)指向son
Son.prototype = res //將子類的prototype 指向父類創(chuàng)建的原型對(duì)象,這樣子類既可以使用父類的方法,又不用實(shí)例化父類
}
inhertPrototype(Son, Parent)
console.log(new Son('jack'))寄生組合式繼承 被稱為最佳繼承模式 他解決了組合繼承父類函數(shù)被調(diào)用兩次的問(wèn)題,同時(shí)又不會(huì)給子類的prototype 加上父類的無(wú)用的屬性

可以對(duì)比組合繼承的圖看一下,prototype 上少了 name ,最佳的繼承方式
到此這篇關(guān)于JavaScript中常見的幾種繼承方式的文章就介紹到這了,更多相關(guān)js繼承方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
layui(1.0.9)文件上傳upload,前后端的實(shí)例代碼
今天小編就為大家分享一篇layui(1.0.9)文件上傳upload,前后端的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
uniapp中使用videojs構(gòu)建H5直播播放器
這篇文章主要為大家介紹了uniapp中使用videojs構(gòu)建H5直播播放器實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
JS實(shí)現(xiàn)的不規(guī)則TAB選項(xiàng)卡效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)的不規(guī)則TAB選項(xiàng)卡效果代碼,基于鼠標(biāo)事件動(dòng)態(tài)設(shè)置頁(yè)面元素樣式實(shí)現(xiàn)該效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
uniapp實(shí)現(xiàn)人臉識(shí)別功能的具體實(shí)現(xiàn)代碼
最近在使用uniapp開發(fā)項(xiàng)目,有刷臉實(shí)名認(rèn)證的需求,下面這篇文章主要給大家介紹了關(guān)于uniapp實(shí)現(xiàn)人臉識(shí)別功能的具體實(shí)現(xiàn),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
js實(shí)現(xiàn)數(shù)組冒泡排序、快速排序原理
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)數(shù)組冒泡排序、快速排序的原理,感興趣的小伙伴們可以參考一下2016-03-03

