1. 程式人生 > >es5繼承、多重繼承、原型鏈

es5繼承、多重繼承、原型鏈

原型鏈

JavaScript 規定,所有物件都有自己的原型物件(prototype)。一方面,任何一個物件,都可以充當其他物件的原型;另一方面,由於原型物件也是物件,所以它也有自己的原型。因此,就會形成一個“原型鏈”(prototype chain):物件到原型,再到原型的原型……

如果一層層地上溯,所有物件的原型最終都可以上溯到Object.prototype,即Object建構函式的prototype屬性。也就是說,所有物件都繼承了Object.prototype的屬性。這就是所有物件都有valueOf和toString方法的原因,因為這是從Object.prototype繼承的。

那麼,Object.prototype物件有沒有它的原型呢?回答是Object.prototype的原型是null。null沒有任何屬性和方法,也沒有自己的原型。因此,原型鏈的盡頭就是null。

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        // 建構函式
        function A(){
            this.age = 11;
            this.method = function (){
                console.
log("this is A’s function"); } } // 模擬類 let a1 = new A(); // 訪問屬性 console.log(a1.age); // 11 // 訪問方法 a1.method(); // this is A’s function // 這種宣告屬性和方法的缺點就是多個例項不能共享方法 let a2 = new A(); console.log(a1.method === a2.method)
; // false // 如何實現共享 // 使用物件的原型屬性 prototype A.prototype.one = function(){ console.log("this is A's one function"); } let a3 = new A(); let a4 = new A(); console.log(a3.one === a4.one); //true // 當例項物件中本來存在屬性 age = 11, // 後面再通過 prototype.age = 12 設定原型屬性 // 是不會覆蓋掉原來的 age = 11 的 // 方法也一樣 A.prototype.age = 12; A.prototype.method = function(){ console.log("this is other method"); } let a5 = new A(); console.log(a5.age); // 11 a5.method(); // 建構函式之間的繼承 function B(){ this.age = 15; } // 方法一: // 可以繼承構造方法A “原有” 的所有屬性和方法 B.prototype = new A(); let b1 = new B(); console.log("b1 constructor:", b1.constructor); console.log("b1 instanceof A:",b1 instanceof A); console.log("b1.age:",b1.age); // 11 b1.method(); // this is A’s function b1.one(); // this is A's one function // 方法二: 推薦 // 可以繼承構造方法A的所有屬性和方法 function C(){ } C.prototype = Object.create(A.prototype); let c1 = new C(); console.log("c1 constructor:", c1.constructor); console.log("c1 instanceof A:",c1 instanceof A); console.log(c1.age); // 12 c1.method(); // this is other method c1.one(); // this is A's one function // 方法三: // function D(){ this.name = 'D'; } D.prototype = A.prototype; D.prototype.age = 13; //該操作會改變構造方法A的原型 D.prototype.constructor = D let a6 = new A(); console.log("a6.age:",a6.age); let d1 = new D(); console.log("d1 instanceof A:",d1 instanceof A); console.log(d1.age); // 12 d1.method(); // this is other method d1.one(); // this is A's one function // 多重繼承 function E() { A.call(this); D.call(this); } E.prototype = Object.create(A.prototype); Object.assign(E.prototype, D.prototype); E.prototype.constructor = E; let e1 = new E(); console.log(e1.age); // 11 console.log(e1.name); // D </script> </body> </html>

相關推薦

es5繼承多重繼承原型

原型鏈 JavaScript 規定,所有物件都有自己的原型物件(prototype)。一方面,任何一個物件,都可以充當其他物件的原型;另一方面,由於原型物件也是物件,所以它也有自己的原型。因此,就會形成一個“原型鏈”(prototype chain):物件到原型

js 繼承(一)之原型借用建構函式組合繼承

前言 … Just we 原型鏈 基本思想利用原型讓一個引用型別繼承另一個引用型別的屬性和方法 function Father() { this.last_name = '張' } Father.prototype.sayLast_Name = fu

2013級C++第12周(春)項目——成員的訪問屬性多重繼承

更新 日期 報告 時間 上下 cin out 讀取 edate 課程首頁在:http://blog.csdn.net/sxhelijian/article/details/11890759,內有完整教學方案及資源鏈接第一部分 程序閱讀 1、閱讀程序。分析類中成員的訪問屬性

【python】繼承多重繼承

python1)繼承基類 class BaseClass: def __init__(self,name,age): self.name = name self.age = age print "baseclass is inited"

24.C++- 抽象類(存虛函數)接口多重繼承

通過 https virtual eache 類的成員 似的 什麽 lan 們的 什麽是抽象類 用來表示現實世界中的抽象概念 是一種只能定義類型,而不能產生對象的類 只能被子類繼承,且抽象類的相關成員函數沒有完整的體現,用來被子類重寫. 比如圖形(Shape)類, 就是

十二python學習之python高階二(property魔法方法和魔法屬性繼承多重繼承閉包和裝飾器)

一、property: 1.get/set方法: 1.1 隱藏實現細節:在使用物件時,儘量不要讓使用者直接操作物件中的屬性,這樣會帶來安全隱患。改進辦法,使用私有屬性。 1.2 提供精確的訪問控制:學習過 set/get方法,是專門來為類的私有屬性提供訪問介面。 1.

C++解析(24):抽象類和介面多重繼承

0.目錄 1.抽象類和介面 1.1 抽象類 1.2 純虛擬函式 1.3 介面 2.被遺棄的多重繼承 2.1 C++中的多重繼承 2.2 多重繼承的問題一 2.3 多重繼承的問題二 2.4 多重繼承的問題三 2.5 正確的使用多重繼承 3.小結 1.抽象類

Scala學習第十五天 Scala多重繼承多重繼承構造器執行順序及AOP實現

1、這講內容對做大型專案十分重要,trait本身可以有方法的實現,這樣做大型工程的具體模組時,可以讓這個模組混入很多不同trait,以實現這個模組功能的不同方面。 2、 PianoTeacher的構造順序是由左往右構造的,但是已經構造了父類,後面子類的父類不會

C++ 深入理解 虛繼承多重繼承和直接繼承

【摘要】 本文從5段程式碼例項出發,通過類中類的普通繼承,類的虛繼承,類的多重繼承,多個虛擬函式類的普通繼承、虛繼承與多重繼承,幾個交叉概念,詳細的闡釋了繼承、虛擬函式與虛繼承的基本概念,深入剖析了繼承於虛繼承的區別於聯絡。 【Exp.001-虛繼承】 #includ

JavaScript面向物件(4)——最佳繼承模式(從深拷貝多重繼承構造器借用,到組合寄生式繼承

       很多同學甚至在相當長的時間裡,都忽略了JavaScript也可以進行面向物件程式設計這個事實。一方面是因為,在入門階段我們所實現的各種頁面互動功能,都非常順理成章地使用過程式程式設計解決了,我們只需要寫一些方法,然後將事件繫結在頁面中的DOM節點上便可以完成。尤

Java 之路 (十) -- 內部類(概念分類特性意義"多重繼承"繼承

1. 內部類基礎 1.1 什麼是內部類 內部類的定義如下: 可以將一個類的定義放在另一個類的定義內部,這就是內部類 更具體一點,對於程式設計思想而言: 內部類允許將邏輯相關的類組織在一起,並控制位於內部的類的可視性。 內部類就像是一種程式碼隱

python類:面向物件繼承slot多重繼承

python面向物件基礎知識面向物件的三大特性:封裝、繼承和多型。繼承在Python中,同時支援單繼承與多繼承,一般語法如下:class SubClassName(ParentClass1 [, ParentClass2, ...]):    class_suite繼承示例1

Python 在子類中呼叫父類方法詳解(單繼承多層繼承多重繼承

測試環境: win7 64位 Python版本:Python 3.3.5 程式碼實踐: 1、在子類中通過“類名”呼叫父類的方法 class FatherA: def __init__(self): print('init

scala-15Scala多重繼承多重繼承構造器執行順序及AOP實現

內容: 1、多重繼承的trait程式碼實戰 2、多重繼承構造器執行順序 3、給予trait的AOP程式碼實現 該程式碼中PianoPlayer類繼承了Human,在構造的時候按照從左到右的順序進行構造,TTeacher和PianoPlayer是PianoTeacher的特性,然後覆寫了TTeacher的抽

JavaScript面向對象編程(9)高速構建繼承關系之整合原型

eight family per ria code prot style triangle super 前面我們鋪墊了非常多細節。是為了讓大家更加明晰prototype的使用細節; 如今能夠將前面的知識整合起來,寫一個函數用於高速構建基於原型鏈的繼承關系了: funct

Golang之繼承多重繼承(struct)

running 結構體 ring style gpo nbsp 結構 繼承 port 熱乎的代碼來了 package main import "fmt" /* 繼承 一個結構體嵌到另一個結構體,稱作組合 匿名和組合的區別 如果一個struct嵌套了

solidity智慧合約[36]-連續繼承多重繼承

連續繼承 合約可以被連續的繼承,在下面的合約中,father繼承了grandfather、son繼承了father。那麼son也同樣繼承了grandfather中的狀態變數和方法。 12345678910111213 contract grandfather{ &nbs

python3 筆記20.類的呼叫和多重繼承多重繼承MRO方法解析順序)

python3 類的多重繼承和 python2 的經典類相差比較遠,需要使用到MRO方法解析順序。 要是順序不對則無法正常繼承。這裡先簡單瞭解。到以後有機會使用再深度學習 # 類的呼叫也是遵循模組呼

01揹包完全揹包多重揹包分組揹包

參考連結: 各種揹包的描述: 01揹包(ZeroOnePack): 有N件物品和一個容量為V的揹包。(每種物品均只有一件)第i件物品的費用是c[i],價值是w[i]。求解將哪些物品裝入揹包可使價值總和最大。 完全揹包(CompletePack): 有N種

POJ 3614 Sunscreen 最大流多重匹配貪心

#include<cstdio> #include<cstring> #define N 5005 #define M 2000005 #define inf 999999999 #include<algorithm> using namespace std; int n