日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

深入JS繼承

瀏覽:174日期:2024-03-28 16:05:53
前言

對于靈活的js而言,繼承相比于java等語言,繼承實現方式可謂百花齊放。方式的多樣就意味著知識點繁多,當然也是面試時繞不開的點。撇開ES6 class不談,傳統的繼承方式你知道幾種?每種實現原理是什么,優劣點能談談嗎。這里就結合具體例子,按照漸進式的思路來看看繼承的發展。

準備

談到js繼承之前先回顧下js 實例化對象的實現方式。

構造函數是指可以通過new 來實例化對象的函數,目的就是為了復用,避免每次都手動聲明對象實例。

new 簡單實現如下:

function my_new(func){ var obj = {} obj._proto_ = func.prototype // 修改原型鏈指向,拼接至func原型鏈 func.call(obj) // 實例屬性賦值 return obj}

由上可以看出,通過構造函數調用,可以將實例屬性賦值到目標對象上。

如此可以推想,子類中調用父類構造函數同樣可以達到繼承的目的。

這就提供了js繼承的一種思路,即通過構造函數調用。

至于原型屬性,就是通過修改原型指向,來實現原型屬性的共享。

那么繼承時同樣也可以通過該方式進行。

總結

基于構造函數和原型鏈兩種特性,結合js語言的靈活性。

繼承的實現方式雖然繁多萬變也不離其宗

繼承的n種方式原型式繼承

定義:這種繼承借助原型并基于已有的對象創建新對象,同時還不用創建自定義類型的方式稱為原型式繼承。

直接看代碼更清晰:

function createObj(o) { function F() { } F.prototype = o; return new F();}var parent = { name: ’trigkit4’, arr: [’brother’, ’sister’, ’baba’]};var child1 = createObj(parent);

該方式表面上看基于對象創建,不需要構造函數(當然實際構造函數被封裝起來罷了)。只借助了原型對象,所以名稱為原型式繼承。

缺點:

比較明顯優良者

無法復用該繼承,每個子類的實例,都要走完整的createObj流程。

對于子類對象

因為構造函數封裝createObj中,對其而言,沒有構造函數。由此造成無法初始化時傳參。補充:其中 createObj 就是我們ES6中常用的Object.create(),不過Object.create進行了完善,允許額外參數來完善了。

解決思路:

既然提到沒有構造函數導致了問題,那么大膽猜測,更進一步就是涉及了構造函數的原型鏈繼承了。

原型鏈式繼承

定義:為了讓子類繼承父類的屬性(也包括方法),首先需要定義一個構造函數。然后,將父類的新實例賦值給構造函數的原型。

function Parent() { this.name = ’mike’;}function Child() { this.age = 12;}Child.prototype = new Parent();child.prototype.contructor = child // 原型屬性被覆蓋,所以要修正回來。var child1 = new Child();

也就是直接修改子類的原型對象指父構造函數的實例,這樣把父類的實例屬性和原型屬性都掛到自己原型鏈上。

缺點

Child.prototype = new Parent() ,那么子函數自身的原型屬性就被覆蓋了,如果需要就要在后面補充。

子對象實例化時,無法向父類構造函數傳遞參數。例如在new Child()執行的時候,想要去覆蓋name,只能在Child.prototype = new Parent()時。 是我們在new Child()的時候統一傳參初始化是更常規需求。

解決思路

如何在子類初始化時,調用父類構造函數。結合前面的基礎,答案也呼之欲出。

借用構造函數(類式繼承)

類式繼承:是在子類型構造函數的內部調用超類型的構造函數。

思路比較清晰,由問題驅動。

既然原型鏈式子類不能向父類傳參的問題,那么在子類初始化是調用父類不就滿足目的了。

示例如下:

function Parent(age) { this.name = [’mike’, ’jack’, ’smith’]; this.age = age;}Parent.prototype.run = function () { return this.name + ’ are both’ + this.age;};function Child(age) { // 調用父類 Parent.call(this, age);}var child1 = new Child(21);

這樣滿足了初始化時傳參的需求,但是問題也比較明顯。

child1.run //undefined

問題

父類原型屬性丟失

父類初始化只繼承了示例屬性,原型屬性在子類的原型鏈上丟失

解決思路

丟失的原因在于原型鏈沒有修改指向,那么修改下指向不就完了。

組合繼承

定義:使用原型鏈實現對原型屬性和方法的繼承,而通過借用構造函數來實現對實例屬性的繼承

示例:

function Parent(age) { this.name = [’mike’, ’jack’, ’smith’]; this.age = age;}Parent.prototype.run = function () { return this.name + ’ are both’ + this.age;};function Child(age) { // 調用父類構造函數 Parent.call(this, age);}Child.prototype = new Parent();//原型屬性繼承Child.prototype.contructor = Childvar child1 = new Child(21);

這樣問題就避免了:

child1.run() // 'mike,jack,smith are both21'

問題

功能滿足之后,就該關注性能了。這種繼承方式問題在于父類構造函數執行了兩次。

分別是:

function Child(age) { // 調用父類構造函數,第二次 Parent.call(this, age);}Child.prototype = new Parent();//修改原型鏈指向,第一次

解決思路

解決自然是取消一次構造函數調用,要取消自然要分析這兩次執行,功能上是否有重復。

第一次同樣繼承了實例和原型屬性,第二次執行同樣繼承了父類的實例屬性。

因此第二次滿足對父類傳參的不可獲取性,因此只能思考能否第一次不調用父類構造函數,只繼承原型屬性。

答案自然是能,前面原型式繼承就是這個思路。

寄生組合式繼承

顧名思義,寄生指的是將繼承原型屬性的方法封裝在特定方法中,組合的是將構造函數繼承組合起來,補充原型式繼承的不足。

饒了點,直接看:

function createObj(o) { function F() { } F.prototype = o; return new F();}//繼承原型屬性 即原型式繼承function create(parent, child) { var f = createObj(parent.prototype);//獲取原型對象 child.prototype = f child.prototype.constructor = child;//增強對象原型,即保持原有constructor指向}function Parent(name) { this.name = name; this.arr = [’brother’, ’sister’, ’parents’];}Parent.prototype.run = function () { return this.name;};function Child(name, age) { // 示例屬性 Parent.call(this, name); this.age = age;}// 原型屬性繼承寄生于該方法中create(Parent.prototype,Child);var child1 = new Child(’trigkit4’, 21);

這樣沿著發現問題解決問題的思路直到相對完善的繼承方式。至于ES的方式本篇就不涉及了。

結束語

唯有厚積,才能薄發,想要心儀的offer,就得準備充裕,夯實基礎,切忌似是而非,道理我都懂就是答得不完全,這樣跟不懂差別也不太大。不算新的日子里立個flag,每周三個知識點回顧。要去相信,你若盛開蝴蝶自來。

以上就是深入JS繼承的詳細內容,更多關于深入JS繼承的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美gv在线| 日韩成人av影视| 激情不卡一区二区三区视频在线| 国产探花一区在线观看| 91欧美极品| 麻豆精品在线观看| 亚洲黄色免费看| 激情六月综合| 丝瓜av网站精品一区二区| 人人精品人人爱| 石原莉奈在线亚洲三区| 亚欧洲精品视频在线观看| 欧美一区二区三区久久| 国产精品免费精品自在线观看| 麻豆精品在线观看| 久久97视频| 成人羞羞视频播放网站| 久久一区二区中文字幕| 不卡在线一区二区| 蜜桃av一区二区| 人人精品久久| 国产一区二区精品福利地址| 婷婷成人在线| 中文精品电影| 麻豆国产一区| 久久美女精品| 亚洲日本国产| 国产一区二区三区久久| 欧美日韩水蜜桃| 亚洲网址在线观看| 国产麻豆一区二区三区 | 亚洲香蕉久久| 国产欧美日韩综合一区在线播放| 国产a久久精品一区二区三区| 亚洲高清不卡| 日本伊人久久| 国产精品久久观看| 日韩中文字幕亚洲一区二区va在线| 欧美日本不卡| 日韩在线欧美| 日韩在线麻豆| 日韩国产网站| 日本综合精品一区| 成午夜精品一区二区三区软件| 成人av二区| 国产精品.xx视频.xxtv| 女人av一区| 国产麻豆精品久久| 国产综合视频| 国产精品流白浆在线观看| 激情欧美一区二区三区| 国产色噜噜噜91在线精品| 欧美影院三区| 日韩精品欧美精品| 久久天堂成人| 国产精品一区二区av日韩在线| 99精品电影| 国产亚洲一区二区三区不卡| 成人羞羞视频在线看网址| 亚洲欧洲国产精品一区| 久久天堂av| 国产精品久久久久久久久久齐齐| 欧美在线亚洲| 日本久久精品| 国产午夜久久av| 国产毛片久久| 精品日韩视频| 久久wwww| 一区二区91| 亚洲成av人片一区二区密柚 | 亚洲一二三区视频| 免费高潮视频95在线观看网站| 日韩精品导航| 精品91久久久久| 日韩免费小视频| 欧美国产极品| 日韩av中文在线观看| 婷婷综合五月| 欧美国产不卡| 日韩黄色av| 国产视频一区在线观看一区免费| 国产不卡精品| 国产精品成人国产| 亚洲青青久久| 尤物精品在线| 久久中文字幕二区| 日韩不卡一区| 国产亚洲电影| 亚洲香蕉久久| 日韩一区二区免费看| 日韩一区电影| 精品久久久久中文字幕小说| 久久精品av麻豆的观看方式| 在线国产日韩| 丝瓜av网站精品一区二区| 99久久亚洲精品| 日韩欧美精品一区| sm捆绑调教国产免费网站在线观看| 国产欧美日韩亚洲一区二区三区| 亚洲尤物av| 亚洲欧美日韩视频二区| 亚洲精品国产偷自在线观看| 伊人久久在线| 动漫av一区| 久久99国产精品视频| 国产精东传媒成人av电影| 国产日韩欧美一区二区三区| 欧美一级二级三级视频| 日韩国产在线不卡视频| 亚洲精品乱码久久久久久蜜桃麻豆 | 日本国产精品| 中文在线资源| 国产精品蜜芽在线观看| 国产91在线精品| 国产精品一级| 国产精品欧美大片| 国产精品麻豆成人av电影艾秋 | 婷婷成人在线| 高清精品久久| 日韩国产欧美| 日韩欧美一区二区三区免费观看| 福利在线一区| 久久国产日本精品| 亚洲黑丝一区二区| 91超碰国产精品| 日韩午夜在线| 亚洲欧美日韩精品一区二区| 亚洲精品一二三区区别| 亚洲一区二区三区免费在线观看| 亚洲欧美日本日韩| 蜜桃久久精品一区二区| 亚洲伊人精品酒店| 日本中文字幕视频一区| 国产欧美另类| 精品国产一区二区三区性色av| 久久男人av| 女生影院久久| 国产91精品对白在线播放| 免费国产自久久久久三四区久久| 精品久久国产一区| а√在线中文在线新版| 精品丝袜在线| 92国产精品| 五月天激情综合网| 男人操女人的视频在线观看欧美| 亚洲狼人精品一区二区三区| 日韩精品免费视频一区二区三区| 久久国产视频网| 91日韩欧美| 欧美+亚洲+精品+三区| 欧美资源在线| 欧美日一区二区在线观看| 国产激情精品一区二区三区| 中文字幕在线官网| 五月天av在线| 久久国产亚洲精品| 久久国产高清| 综合激情五月婷婷| 国产精品宾馆| 中文另类视频| 亚洲精品乱码| 美女国产一区二区三区| 亚洲v在线看| 亚洲精品一二三**| 成人日韩av| 美女国产精品| 美女免费视频一区| 久久精品国产亚洲夜色av网站| 亚洲深夜福利在线观看| 九九99久久精品在免费线bt| 亚洲黄页一区| 欧美国产极品| 久久国产电影| 国产图片一区| 久久要要av| 国产欧美综合一区二区三区| 欧美日韩尤物久久| 日韩毛片网站| 久久久久国产精品一区二区| 婷婷五月色综合香五月| 免费高潮视频95在线观看网站| 亚洲日本国产| 日本不良网站在线观看| 综合国产精品| 精品国模一区二区三区| 91成人在线精品视频| 激情久久五月| 国产视频一区二| 午夜欧美视频| 精品亚洲a∨一区二区三区18| 免费久久99精品国产自在现线| 国产高清日韩| 鲁大师成人一区二区三区| 成人污污视频| 日本成人精品| 不卡av一区二区| 成人午夜在线| 日韩av不卡一区二区| 91九色精品| 精品久久不卡|