深入理解JS原型與原型鏈

  • 2020 年 4 月 19 日
  • 筆記

函數的prototype

1.函數的prototype屬性

*每個函數都有一個prototype屬性,它默認指向一個Object空對象(即稱為原型對 )

* 原型對象中都有一個屬性constructor,它指向函數對象。

 

2.給原型對象添加屬性(一般是方法)

* 作用: 函數的所有實例對象自動擁有原型中的屬性(方法)

 

顯式原型與隱式原型

1. 每個函數function都有一個prototype,即顯式原型(屬性)

2. 每個實例對象都有一個__proto__,可稱為隱式原型(屬性)

3. 對象隱式原型的值為其對應構造函數的顯式原型的值

 

 

4.內存結構圖

 

 

5.總結:

* 函數的prototype屬性:在定義函數時自動添加,默認值是一個空Object對象

* 對象的__proto__屬性: 創建對象時自動添加的,默認值為構造函數的prototype屬性值

* 程序員能直接操作顯示原型,但不能直接操作隱式原型(ES6之前)

 

 

原型鏈

 * 訪問一個對象的屬性時,

 * 先在自身屬性中查找,找到返回

* 如果沒有,再沿着__proto__這條鏈向上查找,找到返回

* 如果最終沒找到,返回undefined

* 別名:隱式原型鏈

* 作用:查找對象的屬性(方法)  ps:查找變量的屬性用 作用域鏈

 

1.原型鏈(圖解)

 

 

2.構造函數/原型/實體對象的關係(圖解)

 

 

function Foo(){ }的本質是 var Foo = new Function()

 Function = new Funtion()

(只有這樣  它自身的顯式原型和隱式原型才是相等的 別的函數沒有這個特點)

 

實例對象的隱式原型屬性=構造函數的顯式原型屬性

 

所有函數的隱式原型__proto__都應該相等。都等於Function.prototype

* 因為所有函數都是new Function() 產生的。

 

 

3.構造函數/原型/實體對象的關係2(圖解)

 

 

 

原型鏈補充

1. 函數的顯式原型指向的對象默認是空Object實例對象(Object不滿足)

 

2.所有函數都是Function的實例(包含Funtion)

 

 

 

原型鏈 屬性問題

1.(隱式)原型鏈是(對象)用來查找屬性值的

  *讀取對象的屬性時:會自動到原型鏈中查找

2.設置對象的屬性值時,不會查找原型鏈,直接添加此屬性並設置值。

    3.方法一般定義在原型中,屬性一般通過構造函數定義在對象身上。