亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

重學JS 系列:聊聊繼承(推薦)

2024-05-06 16:49:51
字體:
來源:轉載
供稿:網友

原型

繼承得靠原型來實現,當然原型不是這篇文章的重點,我們來復習一下即可。
其實原型的概念很簡單:

  1. 所有對象都有一個屬性 __proto__ 指向一個對象,也就是原型
  2. 每個對象的原型都可以通過 constructor 找到構造函數,構造函數也可以通過 prototype 找到原型
  3. 所有函數都可以通過 __proto__ 找到 Function 對象
  4. 所有對象都可以通過 __proto__ 找到 Object 對象
  5. 對象之間通過 __proto__ 連接起來,這樣稱之為原型鏈。當前對象上不存在的屬性可以通過原型鏈一層層往上查找,直到頂層 Object 對象

其實原型中最重要的內容就是這些了,完全沒有必要去看那些長篇大論什么是原型的文章,初學者會越看越迷糊。 

當然如果你想了解更多原型的深入內容,可以閱讀我 之前寫的文章。

ES5 實現繼承

ES5 實現繼承總的來說就兩種辦法,之前寫過這方面的內容,就直接復制來用了。

總的來說這部分的內容我覺得在當下更多的是為了應付面試吧。

組合繼承

組合繼承是最常用的繼承方式,

function Parent(value) { this.val = value}Parent.prototype.getValue = function() { console.log(this.val)}function Child(value) { Parent.call(this, value)}Child.prototype = new Parent()const child = new Child(1)child.getValue() // 1child instanceof Parent // true

以上繼承的方式核心是在子類的構造函數中通過 Parent.call(this) 繼承父類的屬性,然后改變子類的原型為 new Parent() 來繼承父類的函數。

這種繼承方式優點在于構造函數可以傳參,不會與父類引用屬性共享,可以復用父類的函數,但是也存在一個缺點就是在繼承父類函數的時候調用了父類構造函數,導致子類的原型上多了不需要的父類屬性,存在內存上的浪費。

JS,繼承

寄生組合繼承

這種繼承方式對組合繼承進行了優化,組合繼承缺點在于繼承父類函數時調用了構造函數,我們只需要優化掉這點就行了。

function Parent(value) { this.val = value}Parent.prototype.getValue = function() { console.log(this.val)}function Child(value) { Parent.call(this, value)}Child.prototype = Object.create(Parent.prototype, { constructor: {  value: Child,  enumerable: false,  writable: true,  configurable: true }})const child = new Child(1)child.getValue() // 1child instanceof Parent // true

以上繼承實現的核心就是將父類的原型賦值給了子類,并且將構造函數設置為子類,這樣既解決了無用的父類屬性問題,還能正確的找到子類的構造函數。

JS,繼承

Babel 如何編譯 ES6 Class 的

為什么在前文說 ES5 實現繼承更多的是應付面試呢,因為我們現在可以直接使用 class 來實現繼承。

但是 class 畢竟是 ES6 的東西,為了能更好地兼容瀏覽器,我們通常都會通過 Babel 去編譯 ES6 的代碼。接下來我們就來了解下通過 Babel 編譯后的代碼是怎么樣的。

function _possibleConstructorReturn (self, call) {   // ...  return call && (typeof call === 'object' || typeof call === 'function') ? call : self; }function _inherits (subClass, superClass) {   // ...  subClass.prototype = Object.create(superClass && superClass.prototype, {     constructor: {       value: subClass,       enumerable: false,       writable: true,       configurable: true     }   });   if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }var Parent = function Parent () {  // 驗證是否是 Parent 構造出來的 this  _classCallCheck(this, Parent);};var Child = (function (_Parent) {  _inherits(Child, _Parent);  function Child () {    _classCallCheck(this, Child);      return _possibleConstructorReturn(this, (Child.__proto__ || Object.getPrototypeOf(Child)).apply(this, arguments));  }  return Child;}(Parent));

以上代碼就是編譯出來的部分代碼,隱去了一些非核心代碼,我們先來閱讀 _inherits 函數。

設置子類原型部分的代碼其實和寄生組合繼承是一模一樣的,側面也說明了這種實現方式是最好的。但是這部分的代碼多了一句 Object.setPrototypeOf(subClass, superClass),其實這句代碼的作用是為了繼承到父類的靜態方法,之前我們實現的兩種繼承方法都是沒有這個功能的。

然后 Child 構造函數這塊的代碼也基本和之前的實現方式類似。所以總的來說 Babel 實現繼承的方式還是寄生組合繼承,無非多實現了一步繼承父類的靜態方法。

繼承存在的問題

講了這么些如何實現繼承,現在我們來考慮下繼承是否是一個好的選擇?

總的來說,我個人不怎么喜歡繼承,原因呢就一個個來說。

我們先看代碼。假如說我們現在要描述幾輛不同品牌的車,車必然是一個父類,然后各個品牌的車都分別是一個子類。

class Car {  constructor (brand) {    this.brand = brand  }  wheel () {    return '4 個輪子'  }  drvie () {    return '車可以開駕駛'  }  addOil () {    return '車可以加油'  }}Class OtherCar extends Car {}

這部分代碼在當下看著沒啥毛病,實現了車的幾個基本功能,我們也可以通過子類去擴展出各種車。

但是現在出現了新能源車,新能源車是不需要加油的。當然除了加油這個功能不需要,其他幾個車的基本功能還是需要的。

如果新能源車直接繼承車這個父類的話,就出現了第一個問題 ,大猩猩與香蕉問題。這個問題的意思是我們現在只需要一根香蕉,但是卻得到了握著香蕉的大猩猩,大猩猩其實我們是不需要的,但是父類還是強塞給了子類。繼承雖然可以重寫父類的方法,但是并不能選擇需要繼承什么東西。

另外單個父類很難描述清楚所有場景,這就導致我們可能又需要新增幾個不同的父類去描述更多的場景。隨著不斷的擴展,代碼勢必會存在重復,這也是繼承存在的問題之一。

除了以上兩個問題,繼承還存在強耦合的情況,不管怎么樣子類都會和它的父類耦合在一起。

既然出現了強耦合,那么這個架構必定是脆弱的。一旦我們的父類設計的有問題,就會對維護造成很大的影響。因為所有的子類都和父類耦合在一起了,假如更改父類中的任何東西,都可能會導致需要更改所有的子類。

如何解決繼承的問題

繼承更多的是去描述一個東西是什么,描述的不好就會出現各種各樣的問題,那么我們是否有辦法去解決這些問題呢?答案是組合。

什么是組合呢?你可以把這個概念想成是,你擁有各種各樣的零件,可以通過這些零件去造出各種各樣的產品,組合更多的是去描述一個東西能干什么。

現在我們把之前那個車的案例通過組合的方式來實現。

function wheel() { return "4 個輪子";}function drvie() { return "車可以開駕駛";}function addOil() { return "車可以加油";}// 油車const car = compose(wheel, drvie, addOil)// 新能源車const energyCar = compose(wheel, drive)

從上述偽代碼中想必你也發現了組合比繼承好的地方。無論你想描述任何東西,都可以通過幾個函數組合起來的方式去實現。代碼很干凈,也很利于復用。

最后

其實這篇文章的主旨還是后面兩小節的內容,如果你還有什么疑問歡迎在評論區與我互動。

我所有的系列文章都會在我的 Github 中最先更新,有興趣的可以關注下。今年主要會著重寫以下三個專欄

  1. 重學 JS
  2. React 進階
  3. 重寫組件

以上所述是小編給大家介紹的JS繼承詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产精品专区久久| 国产成人精品a视频一区www| 欧美日韩一区二区三区| 亚洲黄色www| 久久亚洲春色中文字幕| 国产日韩在线看| 国产精品嫩草视频| 精品久久久国产精品999| 一区二区三区四区视频| 亚洲第一福利在线观看| 国产午夜精品理论片a级探花| 国产精品十八以下禁看| 欧美裸体xxxx极品少妇软件| 91精品国产成人www| 亚洲最大福利视频网| 精品久久香蕉国产线看观看gif| 国产伦精品一区二区三区精品视频| 色吧影院999| 国产精品一区专区欧美日韩| 日本老师69xxx| 亚洲一区二区中文| 国产婷婷色综合av蜜臀av| 亚洲va电影大全| 韩国视频理论视频久久| 国产原创欧美精品| 欧美亚洲免费电影| 91精品国产免费久久久久久| 91精品国产91久久久久久最新| 精品亚洲一区二区三区四区五区| 亚洲精品永久免费精品| 懂色av中文一区二区三区天美| 国内精品久久久久| 操人视频在线观看欧美| 欧美影院成年免费版| 91久久久久久| 在线性视频日韩欧美| 91在线看www| 欧美国产极速在线| 国产精品视频xxx| 日韩福利视频在线观看| 日韩午夜在线视频| 亚洲综合精品伊人久久| 色中色综合影院手机版在线观看| 91精品国产自产在线观看永久| 国产精品91一区| 亚洲美女福利视频网站| 欧美xxxwww| 欧美精品videosex性欧美| 羞羞色国产精品| 美女久久久久久久久久久| 成人欧美一区二区三区黑人孕妇| 日韩成人在线视频| 欧美一级视频免费在线观看| 91理论片午午论夜理片久久| 日韩电影免费在线观看| 日韩国产欧美精品在线| 国产精品一区二区女厕厕| 欧美亚洲另类激情另类| 日韩中文av在线| 久久久999成人| 亚洲电影免费观看高清完整版在线| 欧美夫妻性视频| 国产亚洲a∨片在线观看| 亚洲无av在线中文字幕| 欧美日韩国产页| 午夜精品久久久久久99热| 久久精品免费播放| 亚洲成人久久一区| 91av在线精品| 亚洲白拍色综合图区| 亚洲已满18点击进入在线看片| 国产精品日韩在线一区| 福利精品视频在线| 国产精品中文久久久久久久| 亚洲国产小视频| 欧美一级视频在线观看| 日韩欧美999| 亚洲精品视频免费| 高清亚洲成在人网站天堂| 欧美特黄级在线| 欧美性开放视频| 欧美一级电影免费在线观看| 91免费欧美精品| 欧美成人sm免费视频| 亚洲国产欧美一区二区丝袜黑人| 久久琪琪电影院| 欧美精品免费在线观看| 亚洲精品国产成人| 成人午夜激情网| 久久精品99久久久香蕉| 91高潮在线观看| 色樱桃影院亚洲精品影院| 久久国产精品视频| 国产精品第三页| 国产丝袜精品第一页| 久久人91精品久久久久久不卡| 欧美性色19p| 日韩影视在线观看| 国产91免费观看| 国产成人福利视频| 97色在线观看| 亚洲第一天堂av| 欧美寡妇偷汉性猛交| 国产精品第七影院| 国产成人精品优优av| 中文字幕在线亚洲| 久久国产视频网站| 国产精品亚洲第一区| 91精品国产高清久久久久久91| 最近2019好看的中文字幕免费| 亚洲人线精品午夜| 亚洲视频综合网| 国产成人在线亚洲欧美| 国产精品视频一区国模私拍| 色狠狠久久aa北条麻妃| 中文字幕日韩精品有码视频| 国内免费久久久久久久久久久| 欧美激情一级精品国产| 国产亚洲精品久久久久久| 成人看片人aa| 亚洲欧美国产精品专区久久| 日韩精品极品在线观看播放免费视频| 久久国产精品视频| 在线播放日韩精品| 日日摸夜夜添一区| 国产精品久久久久久av福利软件| 色中色综合影院手机版在线观看| 久久久久久久久久国产精品| 性欧美视频videos6一9| 亚洲国产精品久久久久| 欧美性受xxxx黑人猛交| 日韩激情第一页| 98精品国产自产在线观看| 日韩av最新在线观看| 欧美视频在线免费| 日韩av123| 最近中文字幕日韩精品| 亚洲第一福利在线观看| 影音先锋欧美在线资源| 欧美性猛交xxxxx水多| 亚洲已满18点击进入在线看片| 亚洲国产精品va在线看黑人动漫| 北条麻妃一区二区三区中文字幕| 欧美性猛交xxxx黑人| 国产97在线视频| 成人网页在线免费观看| 一区二区三区高清国产| 亚洲大胆人体视频| 国产盗摄xxxx视频xxx69| 久久视频中文字幕| 久久影院在线观看| 97精品国产97久久久久久| 国产精品一二三在线| 欧美最顶级的aⅴ艳星| 成人伊人精品色xxxx视频| 欧美日韩一区二区三区| 91国在线精品国内播放| 国产午夜精品视频免费不卡69堂| 久久久最新网址| 欧美精品久久久久久久久久| 中文字幕欧美日韩va免费视频| 国产欧美日韩专区发布| 国产精品久久久久久久久久久久久| 91在线免费网站|