JavaScript原型和原型鏈

JavaScript中除了基本類型外的數據類型,都是對象。但是由於其沒有 類(class)的概念,如何將所有對象聯繫起來就成立一個問題,於是就有了原型和原型鏈的概念。


每個實例對象(object )都有一個私有屬性(稱之為 __proto__)指向它的原型對象(prototype)。該原型對象也有一個自己的原型對象 ,層層向上直到一個對象的原型對象為 null。根據定義,null 沒有原型,並作為這個原型鏈中的最後一個環節。

JavaScript原型和原型鏈

上面是MDN裡有關原型鏈知識的摘錄,什麼意思?讓我們來解釋一下

事實上 JavaScript 所有數據都可以以對象的形式表現:由於函數是對象,我們可以用構造函數的方法使得 Number、Boolean、String變成對象。

下面以 Number 為例 (其他類型也一樣)

可以用 var 基本類型 = new 對應基本類型的函數() 的方法創建一個新的函數

var n = new Number() 創建一個 Number 函數,其是一個對象

JavaScript原型和原型鏈

這裡的 n 就是 Number 的實例,可以看到 n 裡面有一個 __proto__ 指向 Number() 這個函數,Number() 即為 n 的原型對象(prototype) ;

而 Number() 函數有一個 __proto__ 指向 Object() 函數 ,Object() 即為 Number() 的原型對象,Number 是 Object 的實例;

Object() 函數里存在 hasOwnProrerty 證明其已經到達最後的屬性層,再往後就是對象的最終原型對象 null。

JavaScript原型和原型鏈

原型鏈

以上一整個原型與原型層層相鏈接的過程即為原型鏈

其可以將公用屬性存放在同一原型層中,實現共享、節省內存空間等。

當您訪問實例的屬性時,JavaScript首先會檢查它們是否直接存在於該對象上,如果不存在,則會[[Prototype]]中查找。這意味著你在prototype中定義的所有內容都可以由所有實例有效共享,你甚至可以稍後更改部分prototype,並在所有現有實例中顯示更改(如果需要)。


通過以上例子我們可以得到下面兩個“公式”

var 對象 = new 函數()

對象.__proto__ === 對象的構造函數.prototype

我們已經知道

var n = new Number()

n.__proto__ === Number.prototype //true

那麼 Number.__proto__ ?

Number 的原型對象是Function,即 Number 是 Function 的實例

即有

Number.__proto__ === Function.prototype

那麼同理

var object = new Object()

object.__proto__ === Object.prototype

Object.__proto__ === Function.prototype

再進一步推斷

var function = new Function()

function.__proto__ === Function.prototype

Function.__proto__ === Function.prototype

JavaScript原型和原型鏈

Function.__proto__ === Function.prototype


本文主要用於個人學習使用,如有侵權請聯繫我刪除。


分享到:


相關文章: