1. 程式人生 > >ES6學習——類語法:繼承中的原型鏈

ES6學習——類語法:繼承中的原型鏈

上篇文章中我們講了些類的基本概念,其中提到ES6中的類語法是對原型繼承的一種封裝。JS的原型繼承一共有兩條原型鏈,顯示和隱式,那麼在類繼承的語法中,這兩條原型鏈又是怎麼樣的呢?

繼續使用上篇文章中的例子:

class Point{...}

class ColorPoint extends Point{...}

var p = new Point(...),cp = new ColorPoint(...);

下面先一步一步來檢測顯示原型鏈:
typeof Point// function
console.log(Object.getOwnPropertyNames(Point))//["length", "name", "prototype", "getDesc", "TAG"]

typeof ColorPoint //function
console.log(Object.getOwnPropertyNames(ColorPoint))//["length","name","prototype"]
Point和ColorPoint都是function,存在顯示原型prototype屬性,其中Point上還存在靜態屬性TAG和靜態方法getDesc:
console.log(typeof Point.prototype);//object
console.log(Object.getOwnPropertyNames(Point.prototype));//["constructor","toString"]
Point.prototype.constructor === Point//true

console.log(typeof ColorPoint.prototype);//object
console.log(Object.getOwnPropertyNames(ColorPoint.prototype));//["contructor","toString"]
ColorPoint.prototype.constructor === ColorPoint


顯示原型就這兩個,剩下的都是隱式原型了,繼承的關係都靠這條原型鏈完成,我們先看所謂的類Point和ColorPoint隱式原型:
Object.getPrototypeOf(Object.prototype) === null

Object.getPrototypeOf(Function.prototype) === Object.prototype

Object.getPrototypeOf(Point) === Function.prototype//true

Object.getPrototypeOf(ColorPoint) === Point//true
看清上面的關係了嗎?這也是為什麼我們在Point上定義靜態TAG屬性,卻也可以用ColorPoint來訪問。

弄清了類之間的繼承關係,在來看例項之間的繼承關係:

Object.getPrototypeOf(cp) === ColorPoint.prototype//true

Object.getPrototypeOf(ColorPoint.prototype) === Point.prototype//true

Object.getPrototypeOf(Point.prototype) === Object.prototype//true

Object.getPrototypeOf(Object.prototype) === null//true

Object.getPrototypeOf(p) === Point.prototype//true

看清上面的關係了嗎?比較混亂是不是,看下面的圖立刻就清楚了:

看了這個圖是不是腦子裡有了更形象的印象了,要熟記這個原型鏈,對以後複雜的應用會有很大幫助。

我們看幾個其它的例子:

class C{}

Object.getPrototypeOf(C) === Function.prototype//true
Object.getPrototypeOf(C.prototype) === Object.prototype//true

class C extends Object {
}

Object.getPrototypeOf(C) === Object//true
Object.getPrototypeOf(C.prototype) === Object.prototype//true

class C extends null {
}

Object.getPrototypeOf(C) === Function.prototype //true
Object.getPrototypeOf(C.prototype) === null//true


*以上全部程式碼在Chrome 47下通過測試

相關推薦

ES6學習——語法繼承原型

上篇文章中我們講了些類的基本概念,其中提到ES6中的類語法是對原型繼承的一種封裝。JS的原型繼承一共有兩條原型鏈,顯示和隱式,那麼在類繼承的語法中,這兩條原型鏈又是怎麼樣的呢? 繼續使用上篇文章中的例子: class Point{...} class ColorPoin

Java學習筆記總結JAVAString、StringBuilder、StringBuffer的區別

不斷地學習,不斷地填充自己的技術庫,學習Java已經有一段時間了,由一開始的不適應到後來的足以靈活應對,不僅僅取決於老師的精緻講課,還有就是依靠我的學習祕籍:記錄自己的學習筆記。今天給大家分享的技術學習筆記是JAVAString,StringBuilder以及StringBuffer這三個類之間的區

Java學習札記12Java的StringBuilder功能詳解

字串是 Java 程式中最常用的一種資料結構之一。在 Java 中的 String 類已經過載的"+"。也就是說,字串可以直接使用"+"進行連線,如下面程式碼所示: String s = "abc" + "ddd"; 但這樣做真的好嗎?當然,這個問題不能簡單地回答 Yes

C#學習筆記2C#修飾相關的關鍵字

修飾符用於限定型別以及型別成員的申明,C#中的修飾符按功能可分為四部分:屬性修飾符,存取修飾符,類修飾符和成員修飾符。 屬性修飾符: [Serializable]:按值將物件封送到遠端伺服器。在按值封送物件時,就會建立一個該物件的副本,並將其序列化傳送到伺服器。 任何

php學習之道phpis_file和file_exist的差別,and推斷文件夾is_dir

文件 -m post 文件的 style 文件夾 原因 -a 文件名 在PHP中,is_file和file_isexist是有非常小差別的 1) is_file: $path ="/path/to/file/text.txt"; if(file_exis

ES6學習筆記五Promise異步任務

任務 ted 構造函數 才會 數組 接受 異步操作 異步任務 進行 一:Promise對象 Promise對象代表一個異步操作,有三種狀態:Pending(進行中)、Resolved(已完成,又稱 Fulfilled)和Rejected(已失敗)。 二:創建與使用 v

ES6學習筆記九修飾器

target ado ret () code targe 使用 rate get 一:修飾器(Decorator)是一個函數,用來修改類的行為。 1)定義與使用 function 修飾器名(target) { //target是被修飾對象,可用target.xxx進行

【TOJ 5254】C++實驗繼承的構造函數和析構函數

des 能夠 con OS esp space AC tom cto 描述 實現C++類Base和Derived,並編寫相關構造函數和析構函數,使其能夠輸出樣例信息。 主函數裏的代碼已經給出,請補充完整,提交時請勿包含已經給出的代碼。 int main() { Base

MYSQL初級學習筆記七MySQL使用正則表達式!(視頻序號初級_44)

value opened 序號 eight 方式 字符 用戶 包括 學習 知識點九:MySQL中使用正則表達式(44) (1):REGEXP‘匹配方式’: (2):常用匹配方式: 模式字符 ^ 匹配字符開始的部分 $ 匹配字符串結尾的

Java 基礎繼承的執行順序

類的方法 主程 rgs 這一 over print 類繼承 方法 www. 1.單獨的父類測試 Java中,new一個類的對象,類裏面的靜態代碼塊、非靜態代碼、無參構造方法、有參構造方法、類的一般方法等部分, 它們的執行順序相對來說比較簡單,用程序也很容易驗證。 比如

csdn學習筆記二連結串列原型、do原型分析

設計連結串列,並設計其迭代函式 生成連結串列、列印連結串列 arr = {10, 20, 30, 100, 101, 88, 50}; head = nil; local i = 1 while true do if arr[i] then head = {va

USB開裝置開發學習之三USB的端點詳細瞭解

原文:https://blog.csdn.net/go_str/article/details/80985717    前言     端點在實際的USB通訊過程種的具體作用與含義十分重要,但是有些難以理解,自己整理一些知識作為備忘。 (

odoo10學習筆記二繼承(擴充套件)、模組資料

一:繼承 在不改變底層物件的時候新增新的功能——這是通過繼承機制來實現的,作為在現有物件之上的修改層,這些修改可以發生在所有級別:模型,檢視和業務邏輯。不是直接修改現有模組,而是建立一個新模組以新增預期的修改。 1:擴充套件模型 Odoo 模型存在 Python 的模組之外, 在中間登錄檔那裡

odoo10學習筆記二繼承(擴展)、模塊數據

標簽 添加 方便 before 表達 use lds extension 簽名 一:繼承 在不改變底層對象的時候添加新的功能——這是通過繼承機制來實現的,作為在現有對象之上的修改層,這些修改可以發生在所有級別:模型,視圖和業務邏輯。不是直接修改現有

機器學習實戰系列sklearn 模型儲存的兩種方法

一、 sklearn中提供了高效的模型持久化模組joblib,將模型儲存至硬碟。 from sklearn.externals import joblib #lr是一個LogisticRegression模型 joblib.dump(lr, 'lr.model') lr =

Less學習筆記2Less的註釋

Less中的註釋 可是使用css中的註釋:/**/ 也可以使用 // 註釋 (// 編譯的時候會自動過濾掉) ​兩者的區別: /**/ 中的註釋在編譯的是會被編譯出來的,會在編譯生成的CSS中會出現 // 是不會被編譯的,編譯時自動過濾,在編譯生成的C

html5學習筆記三canvas平移,縮放,旋轉等影象變換問題

1,儲存與恢復問題 關鍵字:save / restore save指儲存save之前的canvas狀態,restore恢復save儲存的canvas狀態。舉個例子我想在canvas中隔一秒顯示一個圖片,那我可以先用save指令儲存空白的canvas,然後在顯示一張圖片之後r

Java學習筆記24java valueof 方法的使用

public static String valueOf(boolean b)返回 boolean 引數的字串表示形式。 public static String valueOf(char c)返回 char 引數的字串表示形式。 public static String valueOf(i

Java學習筆記23JavacharAt()方法的使用

此方法返回位於字串的指定索引處的字元。該字串的索引從零開始。 charAt(int index)方法是一個能夠用來檢索特定索引下的字元的String例項的方法. charAt()方法返回指定索引位置的char值。 索引範圍為0~length()-1. 如: str.charA

Java學習筆記18Java使用toString()方法

toString public String toString()返回該物件的字串表示。通常,toString 方法會返回一個“以文字方式表示”此物件的字串。結果應簡明易懂。建議所有子類都重寫此方法。 Object 類的 toString 方法返回一個字串,該字串由類名(物件是該類的一個