javascript 本地對象和內置對象_詳解 JavaScript 面向對象

28d3309f950e128a4df75e9d52c10f9f.png

1. 概述

JavaScript面向對象比較難理解的點是類的繼承。不管是es5寫法還是es6寫法,JavaScript繼承的本質是原型鏈。具體可看我的上一篇文章:

田浩:詳解原型、原型鏈、構造函、實例、new?zhuanlan.zhihu.com
dea03a15090578781e476008350c9f8e.png

因為es6有專門的語法,寫法很簡單且容易理解,所以本文將著重介紹es5的實現繼承不同方式及其原理。

再閱讀本文之前,一定要注意區分幾個名詞:父類、子類、子類的實例。


2.類的聲明和實例化:

/*** 類的聲明*/
var Animal = function () {this.name = 'Animal';
};/*** es6中class的聲明*/
class Animal2 {constructor () {this.name = 'Animal2';}
}/*** 實例化方式相同*/
let dog = new Animal();
let dog2 = new Animal2();

2. ES5中類的繼承:

2.1 借助構造函數實現繼承(部分繼承)

function Parent1 () {this.name = 'parent1';
}Parent1.prototype.say = function () {
};      // 不會被子類繼承function Child1 () {Parent1.call(this);this.type = 'child1';
}   

原理:

核心在于:Parent1.call(this)

改變Parant1運行時的this的指向,指向子構造函數,所以父類中有的屬性,子類中也有。

缺點:

父類原型鏈上的屬性方法并沒有被子類繼承。 所以這種方式不能成為繼承,只能叫做部分繼承。

2.2 借助原型鏈實現繼承

function Parent2 () {this.name = 'parent2';this.array = [1,2,3];
}
function Child2 () {this.type = 'child2';
}
Child2.prototype = new Parent2();

原理:

核心在于: Child2.prototype =new Parent2();

將Parent2的一個實例作為Child2的prototype。訪問Child2的實例時候,實例可以通過__proto__訪問Parent2中的屬性。

缺點:

試想,如果Child2實例兩個對象s1、s2,他們通過__proto__訪問的父類上的屬性實際上是同一個引用(s1.__proto__ === s2.__proto__)。這樣,比如s1修改array,s2的array也會跟著變。這是我們所不想看到的。

2.3 組合方式

將上兩種組合:

function Parent3 () {this.name = 'parent3';this.array = [1, 2, 3];
}
function Child3 () {Parent3.call(this); this.type = 'child3';
}
Child3.prototype = new Parent3();

原理:

核心在于: 將上兩種方式結合。實際上,子類的實例中,Parent3上的屬性會存在兩份,一份在實例中,一份在實例的__proto__上:

1c6cee89fe02859c621aa9772a18c27e.png

缺點:

實例化子類的時候,父類執行了兩次,且子類實例中存在冗余數據。這些都是沒有必要的。

2.4 組合繼承的優化1

function Parent4 () {this.name = 'parent4';this.play = [1, 2, 3];
}
function Child4 () {Parent4.call(this);this.type = 'child4';
}
Child4.prototype = Parent4.prototype;

原理:

核心在于: 將 Parent4的prototype直接賦給Child4.prototype。此時父類只執行一次。

af17c36a539014af380e66dbe2518fe7.png

缺點:

子類實例的constructor會指向父類:a的constructor會指向Parent4,不符合預期,無法區分這個實例是父類創造的還是子類創造的。當然這個缺點在2.3中也存在。原因是constructor屬性來自原型對象中,上述方法子類的實例訪問constructor 實際訪問的事父類的prototype中的constructor。

2.5 組合繼承的優化2

function Parent5 () {this.name = 'parent5';this.play = [1, 2, 3];
}
function Child5 () {Parent5.call(this);this.type = 'child5';
}
Child5.prototype = Object.create(Parent5.prototype);
// 手動修改constructor指向,由于父類的prototype和子類的prototype已經隔離開,可以放心修改。
Child5.prototype.constructor = Child5;

原理:

核心在于: Object.create(Parent5.prototype);

Object.create()方法創建一個新對象,使用現有的對象來提供新創建的對象的__proto__。

Object.create()?developer.mozilla.org
244ab3dcc27b0a9273904db2f9950afa.png

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

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

相關文章

android wifi設備連接通信,通過wifi與設備進行通信(Android)

通過wifi與設備進行通信(Android)[復制鏈接]本帖最后由 灞波兒奔 于 2019-2-17 21:40 編輯通過wifi與設備進行通信(Android)最近leader決定把app與設備之間的通信改為wifi,通過http協議實現設備之間的通信。相對與之前的藍牙通信,的確簡單不少&#xff0…

工作匯報ppt案例_【贈書】開工大吉!今年一定要干過寫PPT的!

不知不覺,春節就過去了,新年開工,朋友圈里曬滿了開工紅包,領了開工禮就意味著真正新的一年開始了。雖然假期的慵懶安逸留下了倦怠的后遺癥,但狀態依舊切換到工作模式,畢竟每年都希望能比過去更進一步&#…

android webview 長按復制,Android webview 點擊或長按有蒙層 – 熱愛改變生活

Android 使用 webview 加載本地 html,在本地 html 上面點擊的時候會有一層橙色的蒙層,使用下面的代碼可以去掉。body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquo…

postscript打印機什么意思_漲知識|你不知道的關于打印機的打印過程和打印機驅動的那些事...

以前一直以為打印很簡單,不就是編輯好文件按個“打印”就行了?但其實打印過程可以復雜到你分分鐘“懷疑人生”。你以為的打印過程可能是這樣的 ↓。我們看到的打印過程然而,真正的打印過程是這樣的 ↓。實際上的打印過程打印機打印一頁文件或…

python dicom圖像分割_python讀取DICOM頭文件的實例

這篇文章主要介紹了關于python 讀取DICOM頭文件的實例,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下 用dicompyler軟件打開dicom圖像,頭文件如圖所示:當然也可以直接讀取: ds dicom.read_…

索尼android電視圖片輪播,電視投屏居然還能這樣玩?

原標題:電視投屏居然還能這樣玩?現如今,投屏幾乎成為大家日常生活必不可少的一種觀影方式,通過電視投屏可以帶來更清晰的畫面效果,成為追劇黨以及各類球賽愛好者的不二之選。那么今天小智就以索尼電視為例,…

python源碼多平臺編譯_提升Python程序運行效率的6個方法

Python是一個很酷的語言,因為你可以在很短的時間內利用很少的代碼做很多事情。不僅如此,它還能輕松地支持多任務,比如多進程等。Python批評者有時會說Python執行緩慢。本文將嘗試介紹6個技巧,可加速你的Python應用程序。 1.讓關鍵…

android 高并發彈幕,高并發實時直播彈幕研發實踐

高并發實時直播彈幕研發實踐直播間特點聊天室限制人數的原因應對萬級以上的實時互動跨服務器是為了解決單一服務器接入數量限制、發布消息吞吐限制等問題;多進程并發則是為了充分利用多核CPU以及減小一個循環規模從而達到降低延遲的目的。云巴實時系統的設計云巴是基…

linux python3_在Linux上安裝Python 3

在Linux上安裝Python 3這份文檔描述了如何在Ubuntu Linux機器上安裝Python 3.6。 想要獲取已安裝的Python 3版本號,可以通過終端運行命令: $ python3 --version 如果您使用的是Ubuntu 16.10或更新,可以通過以下命令簡單地安裝Python 3.6: $ s…

android手機電話鈴聲設置,安卓手機鈴聲怎么設置

網上有很多安卓手機鈴聲的設置教程,說什么SD卡里建立這個那個的文件夾,那問題是怎么才能進到SD卡里去建立文件夾啊?手機里哪個選項里進去呢?這里小編告訴你,可以通過電腦連接數據線管理SD卡。下面介紹兩種簡單的設置安…

安裝squid_「首席推薦」設置Squid轉發代理或者正向代理

如果您正在閱讀這篇文章,您可能會因為缺少與Squid相關的信息而感到沮喪,Squid是一種非常流行的轉發代理。這些令人沮喪的事情包括:在小的軟件修訂之后出現的重大的可用性變化,對幕后發生的事情的誤解,以及真正糟糕的文檔。這是一個…

android壓縮圖片質量,Android 圖片質量壓縮有關問題

Android 圖片質量壓縮問題本帖最后由 u013064347 于 2014-01-13 10:22:47 編輯網上看到一個圖片質量壓縮法,傳入1M以內圖片能正常壓縮,但是傳入2M多的圖片就報內存溢出,應該怎么解決?附上代碼Bitmap imagesBitmapFactory.decodeFi…

python標準庫os_Python基礎--人們一些最愛的標準庫(sys os fileinput)

這篇博客就介紹介紹常見的、人們鐘愛的python中的標準庫。 sys 從字面上也能看出來,是system的縮寫。這個模塊能夠訪問與python解析器緊密聯系的變量和函數。 argv 命令行參數 exit 退出當前程序 modules 映射模塊名到載入模塊的字典 path 目錄 platform 平臺標識符…

android區域截圖app,【干貨】最新App應用市場截圖尺寸大全

今天給大家分享最新的干貨,剛好碰上這段時間設計市場截圖,所以給各位設計新人,分享本人整合的尺寸大全,希望對你們的設計之路有所幫助。一、IOS App Store尺寸尺寸(機型) 大小(px)3.5寸(iphone4/4s)…

python如何運行一個python程序_在python中,如何運行一個命令行程序,它在發送Ctrl+D之前不會返回...

由于沒有人提供任何代碼來幫助解決這個問題,我將做如下的事情。結果發現pexpect非常強大,而且您不需要signal模塊。在import os import sys import pexpect def run_server(): server_dir /path/to/server/root current_dir os.path.abspath(os.curdir…

android app外喚起,Android 喚起app的多種方式

方式一(通過Intent喚起):我們自己的app代碼:ComponentName componetName new ComponentName("com.lh.jimtrency.webviewdemo","com.lh.jimtrency.webviewdemo.MainActivity");//(另外一個應用程序的包名,要啟動的Activi…

2018python做圖形界面哪個庫簡單_2018年常見的python編程開發庫都有哪些類型

python編程開發可以說是目前比較熱門的一項編程開發語言了,而今天我們就一起來了解一下,關于python編程都有哪些常見的python庫可以使用。1、TensorFlow “TensorFlow是一個使用數據流圖進行數值計算的開源軟件庫。圖形節點表示數學運算,而圖…

android條形圖,MPAndroid組條形圖未顯示

這個問題已經在這里有了答案:????????????>????????????How to check if activity is in foreground or in visible background?????????????????????????????????????22個這是我用于使用MPAndroi…

c++ socket線程池_java 網絡編程,Socket編程

Java的網絡編程主要涉及到的內容是Socket編程,那么什么是Socket呢?簡單地說,Socket,套接字,就是兩臺主機之間邏輯連接的端點。TPC/IP協議是傳輸層協議,主要解決數據如何在網絡中傳輸,而HTTP是應…

android簽名忘記密碼,修改Android簽名證書keystore的密碼、別名alias以及別名密碼

之前在測試Eclipse ADT的Custom debug Eclipse ADT的Custom debug keystore所需證書規格,提到過自定義調試證書的密碼和1. 首先當然是先復制一份正式證書出來作為要修改為的臨時調試證書。2. 修改keystore密碼的命令(keytool為JDK帶的命令行工具):keytoo…