捋一捋js面向對象的繼承問題

  說到面向對象這個破玩意,曾經一度我都處于很懵逼的狀態,那么面向對象究竟是什么呢?其實說白了,所謂面向對象,就是基于類這個概念,來實現封裝、繼承和多態的一種編程思想罷了。今天我們就來說一下這其中繼承的問題。

  好,先不直接上代碼,而是反手來一波文字說明,捋一捋思路。

  曾經一段時間因為javascript關于類實現繼承的不規范,導致各種各樣實現繼承的代碼;而實際上不管代碼怎么變,繼承都基于兩種方式:

  1.通過原型鏈,即子類的原型指向父類的實例從而實現原型共享。
  2.借用構造函數,即通過js的apply、call實現子類調用父類的屬性、方法;
  原型鏈方式可以實現所有屬性方法共享,但無法做到屬性、方法獨享(例如son1指向的是父類實例,son2,son3同樣如此,大家都是吃的同一碗飯);

  而借用構造函數除了能獨享屬性、方法外還能在子類構造函數中傳遞參數,但代碼無法復用。總體而言就是可以實現所有屬性方法獨享,但無法做到屬性、方法共享(例如,son1新增了一個函數,然后想讓son2、son3一起用的話就無法實現了,只能son2,son3各自在構造函數中新增)。

  組合繼承就是把以上兩種繼承方式一起使用,把共享的屬性、方法用原型鏈繼承實現,獨享的屬性、方法用借用構造函數實現,所以組合繼承幾乎完美實現了js的繼承;
為什么說是“幾乎”?因為后來人們發現組合繼承有一個小bug,實現的時候調用了兩次父類,性能上不合格啊有木有!怎么解決呢?于是“寄生繼承”就出來了。

  寄生繼承:
  簡單而言,寄生繼承就是不用實例化父類了,直接實例化一個臨時副本實現了相同的原型鏈繼承。(即子類的原型指向父類原型的副本),如此一來,這個問題就完美解決了。
  接下來是代碼部分:
  
這里我們通過apply方法給兒子傳了私有屬性,但是父類原型上的方法是無法調用的。
然后我們試試通過原型鏈來實現繼承。
這樣一來就把父類的全部東西都一股腦繼承下來了,而且我這里如果Sons修改了父類的原型,其他跟著用的比如Daughters也要跟著遭殃。
而組合繼承這時候就出來了,組合繼承就是把以上兩種繼承方式一起使用,把共享的屬性、方法用原型鏈繼承實現;獨享的屬性、方法用借用構造函數實現。至于寄生組合繼承,它是為了解決組合繼承會二次調用父類這個bug出現的優化方法,具體實現如下:
在這一步,無論是兒子還是女兒,都能成功調用父類的公用方法。接著在末尾添加兩行代碼往下看:
兩個say方法雖然同名,卻互不影響。最后調用父類的私有屬性看看:
只有兒子利用私有屬性拿到了secret,而女兒沒有拿到,完美解決共享與獨享分配的問題!

轉載于:https://www.cnblogs.com/zhangnan35/p/8473061.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252319.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java8簡單入門

1、介紹 本片文章會從一下幾個知識點進行介紹: 函數式接口 FunctionalInterfaceLambda 表達式函數引用 Function ReferenceStream看了幾篇關于 java8 入門的例子,其中引入了許多令人期待已久的特性(雖然我沒有過這樣的體會)&#…

玩轉帶外觸發的單目相機之一

背景:去年開始研究vins,但是只是用了普通的相機,然后將IMU和相機粘在一起,然后就是聯合標定相機和IMU。VINS使用的相機是帶有外觸發的,還進行了相機和IMU的硬件時間同步。當時我特別想買個帶外觸發的相機,一直沒找到資…

基于django的視頻點播網站開發-step11-后臺用戶管理功能...

用戶管理功能,包含用戶添加、列表展示、編輯、刪除四大功能。下面我們一一揭曉。 用戶添加 我們先實現用戶添加功能,我們現在urls.py下添加相關的路由 path(user_add/, views.UserAddView.as_view(), nameuser_add), path(user_list/, views.UserListVie…

BZOJ 1070 拆點 費用流

1070: [SCOI2007]修車 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 5860 Solved: 2487[Submit][Status][Discuss]Description 同一時刻有N位車主帶著他們的愛車來到了汽車維修中心。維修中心共有M位技術人員,不同的技術人員對不同 的車進行維修所用的時間是不…

分布式之數據庫和緩存雙寫一致性方案解析

先做一個說明,從理論上來說,給緩存設置過期時間,是保證最終一致性的解決方案。這種方案下,我們可以對存入緩存的數據設置過期時間,所有的寫操作以數據庫為準,對緩存操作只是盡最大努力即可。也就是說如果數…

使用python從csv文件中讀入兩列擬合直線

背景:要判斷跟蹤算法在控制目標物走直線的情況下跟蹤的軌跡是否為直線,我保存下來跟蹤算法跟蹤到的目標的中心點在圖像上的像素位置,然后擬合出穿過這些點的直線,然后計算這些點距離直線的平均距離來判斷跟蹤的精度。(…

window document

1 打開一個新窗口 var newDocwindow.open("text/html","replace");var txt"<html><body>Learning about the DOM is FUN!</body></html>";newDoc.document.write(txt);newDoc.close(); //該方法將關閉 open() 方法打開…

‘(‘:illegal token on right side of ‘::‘

背景&#xff1a;想整理升級一下代碼&#xff0c;添加了兩個類&#xff0c;再一編譯代碼&#xff0c;出現了好多這樣的錯誤提示“(:illegal token on right side of ::”&#xff0c;我很納悶這是啥問題&#xff0c;我就使用“注釋法”來定位出錯的位置&#xff0c;我發現把所有…

mysql-數據庫操作

doc界面操作mysql:<br/> 以phpstudy為例 登錄數據庫&#xff1a;進入phpstudy/mysql/bin下&#xff0c;mysql -u用戶名 -p密碼 選擇數據庫&#xff1a;use 數據庫名; 設置編碼格式&#xff1a;set names gbk; 查看表結構或字段信息&#xff1a;desc 表名; 建立數據庫&…

虹軟免費人臉識別SDK注冊指南

2019獨角獸企業重金招聘Python工程師標準>>> 成為開發者三步完成賬號的基本注冊與認證&#xff1a; STEP1:點擊注冊虹軟AI開放平臺右上角注冊選項&#xff0c;完成注冊流程。 STEP2:首次使用&#xff0c;登錄后進入開發者中心&#xff0c;點擊賬號管理完成企業或者個…

Mybatis使用statementType=STATEMENT實現動態傳入表名或字段名

mybatis中使用statementType"STATEMENT"實現動態傳入字段名時一直報語句錯誤&#xff0c;但實際上語句并沒有毛病&#xff0c;爬了一天坑才找到問題&#xff0c;記錄一下。 整條語句中里所有傳入的值都要使用${xxx},不能使用#{xxx}。 <select id"listMap&quo…

C++中的類加多線程代碼修煉

背景&#xff1a;現在在做一個目標跟蹤的項目&#xff0c;需要實時的從工業相機中獲取圖像&#xff0c;然后再跟蹤圖像上的目標物&#xff0c;由于起初為了測試跟蹤算法&#xff0c;就把“從相機獲取圖像”和“跟蹤處理”都放在了主線程中&#xff0c;在實際測試時&#xff0c;…

Activity Monitor 閃退 無法進入睡眠

Activity Monitor 閃退 & 無法進入睡眠 情況描述 黑蘋果?主機突然無法進入睡眠。 考慮到可能是后臺程序阻礙了系統正常進入睡眠&#xff0c; 于是想要通過Activity Monitor查看系統的活動情況&#xff0c;然而&#xff0c;Activity Monitor閃退。 重新開機&#xff0c;快速…

hbase中清空整張表的數據

hbase(main):005:0> truncate fr:test Truncating FaceBase table (it may take a while):- Disabling table...- Dropping table...- Creating table...0 row(s) in 14.4220 seconds truncate是disable、drop、create三個動作的自動化集成。轉載于:https://www.cnblogs.com…

hibernate樹

1. 樹實現通過pid進行指向上一層來實現&#xff0c;實體類代碼如下 package com.test.model;import java.util.HashSet; import java.util.Set;import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.per…

Sleep() sleep() usleep()

Linux: sleep(n); //停留n秒 usleep(n); //停留n微秒 Windows: Sleep(n); //停留n毫秒

vue的鼠標移入和移出

vue的鼠標移入和移出 需求&#xff08;鼠標到預約二維碼顯示&#xff0c;預約添加背景色&#xff09; 實現 <!--html部分--> <ul class"person_list"> //五個li標簽皆是循環渲染出來的<li class"item" v-for"(n,index) in 5">…

聊聊flink的MemoryPool

為什么80%的碼農都做不了架構師&#xff1f;>>> 序 本文主要研究一下flink的MemoryPool MemoryPool flink-runtime_2.11-1.7.2-sources.jar!/org/apache/flink/runtime/memory/MemoryManager.java abstract static class MemoryPool {abstract int getNumberOfAvai…

day4

ti很簡單&#xff0c;但是把變量弄錯了&#xff0c;寫了不到半小時&#xff0c;調了一小時&#xff0c;導致t3功虧一簣。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> …

C++中public protected private的區別

1. 不考慮繼承關系時 本類方法使用外部使用private是否protected是否public是是 2. 有繼承關系時 子類方法使用外部private否否protected是否public是是 結論&#xff1a;基于以上兩個表格可以知道&#xff0c;C中的protected處于private和public中間&#xff0c; protected 既…