一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - js中實現繼承的五種方法

js中實現繼承的五種方法

2022-01-07 16:24菜小牛 js教程

這篇文章主要介紹了js中實現繼承的五種方法,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下

借用構造函數

這種技術的基本思想很簡單,就是在子類型構造函數的內部調用超類型的構造函數。另外,函數只不過是在特定環境中執行代碼的對象,因此通過使用apply()和call()方法也可以在新創建的對象上執行構造函數。

?
1
2
3
4
5
6
7
8
9
10
11
12
function Box(name){
 this.name = name
}
Box.prototype.age = 18
 
function Desk(name){
 Box.call(this, name) // 對象冒充,對象冒充只能繼承構造里的信息
}
 
var desk = new Desk('ccc')
console.log(desk.name)   // --> ccc
console.log(desk.age)    // --> undefined

從中可以看到,繼承來的只有實例屬性,而原型上的屬性是訪問不到的。這種模式解決了兩個問題,就是可以傳參,可以繼承,但是沒有原型,就沒有辦法復用。

組合繼承

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function Box(name){
 this.name = name
}
Box.prototype.run = function (){
 console.log(this.name + '正在運行...')
}
 
function Desk(name){
 Box.call(this, name) // 對象冒充
}
 
Desk.prototype = new Box() // 原型鏈
 
var desk = new Desk('ccc')
console.log(desk.name)   // --> ccc
desk.run()         // --> ccc正在運行...

這種繼承方式的思路是:用使用原型鏈的方式來實現對原型屬性和方法的繼承,而通過借用構造函數來實現對實例屬性的繼承。

原型式繼承

原型式繼承:是借助原型可以基于已有的對象創建新對象,同時還不必因此創建自定義類型。講到這里必須得提到一個人,道格拉斯·克羅克福德在2006年寫的一篇文章《Prototype inheritance in Javascript》(Javascript中的原型式繼承)中給出了一個方法:

?
1
2
3
4
5
function object(o) {   //傳遞一個字面量函數
 function F(){}     //創建一個構造函數
 F.prototype = o;    //把字面量函數賦值給構造函數的原型
 return new F()     //最終返回出實例化的構造函數
}

看如下的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function obj(o) {
 function F (){}
 F.prototype = o;
 return new F()
}
 
var box = {
 name: 'ccc',
 age: 18,
 family: ['哥哥','姐姐']
}
 
var box1 = obj(box)
console.log(box1.name)   // --> ccc
box1.family.push('妹妹')
console.log(box1.family)  // --> ["哥哥", "姐姐", "妹妹"]
 
var box2 = obj(box)
console.log(box2.family)  // --> ["哥哥", "姐姐", "妹妹"]

因為上述的代碼的實現邏輯跟原型鏈繼承很類似,所以里面的引用數組,即family屬性被共享了。

寄生式繼承

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function obj(o) {
 function F (){}
 F.prototype = o;
 return new F()
}
function create(o){
 var clone = obj(o)   // 通過調用函數創建一個新對象
 clone.sayName = function(){   // 以某種方式來增強這個對象
  console.log('hi')
 }
 return clone   // 返回這個對象
}
 
var person = {
 name: 'ccc',
 friends: ['aa','bb']
}
 
var anotherPerson = create(person)
anotherPerson.sayName()   // --> hi

這個例子中的代碼基于person返回一個新對象————anotherPerson。新對象不僅具有person的所有屬性和方法,而且還有自己的sayHi()方法。在主要考慮對象而不是自定義類型和構造函數的情況下,寄生式繼承也是一種有用的模式。使用寄生式繼承來為對象添加函數,會由于不能做到函數復用而降低效率,這一點與構造函數模式類似。

寄生組合式繼承

前面說過,組合繼承是Javascript最常用的繼承模式,不過,它也有自己的不足。組合繼承最大的問題就是無論什么情況下,都會調用過兩次超類型構造函數:一次是在創建子類型原型的時候,另一次是在子類型構造函數內部。沒錯,子類型最終會包含超類型對象的全部實例屬性,但我們不得不在調用子類型構造函數時重寫這些屬性,再來看一下下面的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function SuperType(name){
 this.name = name;
 this.colors = ['red','black']
}
SuperType.prototype.sayName = function (){
 console.log(this.name)
}
function SubType(name, age){
 SuperType.call(this, name) // 第二次調用SuperType
 this.age = age
}
 
SubType.prototype = new SuperType() // 第一次調用SuperType
SubType.prototype.constructor = SubType
SubType.prototype.sayAge = function (){
 console.log(this.age)
}

第一次調用SuperType構造函數時,SubType.prototype會得到兩個屬性:name和colors。他們都是SuperType的實例屬性,只不過現在位于SubType的原型中。當調用SubType構造函數時,又會調用一次SuperType構造函數,這個一次又在新對象上創建了實例屬性name和colors。于是,這兩個屬性就屏蔽了原型中的兩個同名屬性。即有兩組name和colors屬性:一組在實例上,一組在原型上。這就是調用兩次SuperType構造函數的結果。解決這個問題的方法就是————寄生組合式繼承。
所謂寄生組合式繼承,即通過借用構造函數來繼承屬性,通過原型鏈的混成形式來繼承方法。其背后的基本思路是:不必為了制定子類型的原型而調用超類型的構造函數,我們所需要的無非就是超類型原型的一個副本而已。本質上,就是使用寄生式繼承來繼承超類型的原型,然后再將結果指定給子類型的原型。寄生組合式繼承的基本模式如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function object(o) {
 function F (){}
 F.prototype = o;
 return new F()
}
function inheritPtototype(subType, superType){
 var prototype = object(superType.prototype) // 創建對象
 prototype.constructor = subType       // 增強對象
 subType.prototype = prototype        // 指定對象
}
 
function SuperType(name){
 this.name = name
 this.colors = ['red', 'white']
}
 
SuperType.prototype.sayName = function(){
 console.log(this.name)
}
 
function SubType(name,age){
 SuperType.call(this,name)
 this.age = age
}
 
inheritPtototype(SubType, SuperType)
 
SubType.prototype.sayAge = function(){
 console.log(this.age)
}
 
var instance = new SubType('ccc', 18)
 
instance.sayName()   // --> ccc
instance.sayAge()    // --> 18
console.log(instance)

控制臺打印出的結構:

js中實現繼承的五種方法

詳細的圖解:

js中實現繼承的五種方法

這個例子的高效率提現在它值調用了一次SuperType構造函數,并且因此避免了在SubType.prototype上面創建不必要的、多余的屬性。與此同時,原型鏈還能保持不變;因此,還能夠正常使用instanceof和isPrototypeOf()。這也是很多大廠用的繼承方式。

以上就是js中實現繼承的五種方法的詳細內容,更多關于js 實現繼承的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/cirry/p/js-inherit.html

延伸 · 閱讀

精彩推薦
  • js教程基于 Next.js 的 SSR/SSG 方案了解一下?

    基于 Next.js 的 SSR/SSG 方案了解一下?

    服務端渲染(SSR,Server Side Render)與客戶端渲染(CSR,Client Side Render)的核心區分點簡單來說就是完整的 HTML 文檔在服務端還是瀏覽器里組裝完成。...

    DYBOY4532021-12-27
  • js教程微信小程序選擇圖片控件

    微信小程序選擇圖片控件

    這篇文章主要為大家詳細介紹了微信小程序選擇圖片控件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    小雅雅家的小凱凱吖9692022-01-04
  • js教程微信小程序抽獎組件的使用步驟

    微信小程序抽獎組件的使用步驟

    這篇文章主要給大家介紹了關于微信小程序抽獎組件的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需...

    い 狂奔的蝸牛10762021-12-29
  • js教程three.js顯示中文字體與tween應用詳析

    three.js顯示中文字體與tween應用詳析

    這篇文章主要給大家介紹了關于three.js顯示中文字體與tween應用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習...

    郭志強9822021-12-24
  • js教程js動態生成表格(節點操作)

    js動態生成表格(節點操作)

    這篇文章主要為大家詳細介紹了js動態生成表格,進行節點操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    劉劉劉code3532021-12-30
  • js教程js刪除指定位置超鏈接中含有百度與360的標題

    js刪除指定位置超鏈接中含有百度與360的標題

    最近需要將最近更新的部分內容刪除,只要標題中包括百度與360的都給刪除了,主要用到了jquery的each,需要的朋友可以參考下...

    JS教程網3682021-12-27
  • js教程前端經常會用到的JavaScript方法封裝

    前端經常會用到的JavaScript方法封裝

    前端經常會用到的JavaScript方法封裝都有哪些呢?我們一起來看一下吧!...

    Find一只程序猿11372021-12-30
  • js教程mustache.js實現首頁元件動態渲染的示例代碼

    mustache.js實現首頁元件動態渲染的示例代碼

    這篇文章主要介紹了mustache.js實現首頁元件動態渲染的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可...

    code2roc4232021-12-21
主站蜘蛛池模板: 爱欲荡漾在线观看 | 国内久久精品 | 国产一区二区精品久久 | japanese日本护士 | 久久国产影院 | 国产成人免费在线视频 | 久久综合中文字幕佐佐木希 | 四虎影视e456fcom四虎影视 | 久久精品亚洲牛牛影视 | 好大用力深一点女公交车 | 亚洲入口 | 国产尤物精品视频 | 四虎影视在线观看2413 | 成人私人影院www片免费高清 | 美女用手扒开粉嫩的屁股 | 天堂伊人网 | 好湿好滑好硬好爽好深视频 | japanese厕所撒尿 | 亚洲精品久久久WWW游戏好玩 | 四虎精品成人a在线观看 | 久久无码AV亚洲精品色午夜麻豆 | 国产高清视频在线 | 搡60一70岁的老女人小说 | 高h射尿| 欧美a一级片| 亚洲国产精品久久网午夜小说 | 91影视在线看免费观看 | 久久99re2在线视频精品 | 荡女淫春2古装 | 免费午夜网站 | 西西人体大胆啪啪私拍色约约 | 禁止的爱善良的未删减版hd | 成人影院在线观看免费 | 赤坂丽女医bd无删减在线观看 | 精品国产成人a区在线观看 精品高潮呻吟99AV无码视频 | 韩国甜性涩爱在线播放 | 涩色网| 成人一级黄色大片 | 欧美一级xxxx俄罗斯一级 | 福利视频一区二区思瑞 | 欧美另类bbbxxxxx另类 |