js 原型,原型鏈

函數的prototype

1.函數的prototype屬性

–每個函數都有一個prototype屬性,它默認指向一個Object空對象(稱爲原型對象(構造函數通過prototype和原型對象通過constructor相互引用))

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

2.給原型對象添加屬性(一般都是方法)=>實例對象可以訪問

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

顯式原型和隱式原型

1.每個函數function都有一個prototype,即顯式原型(屬性),函數的顯式原型指向的對象:默認是空的Object實例對象(但Object,Function不滿足)

2.每個實例對象都有一個__proto__ 可稱爲隱式原型(屬性),所有函數都是Function的實例(包含Function)

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

4.內存結構

5.總結:

–函數的prototype屬性,在定義函數是自動添加的,默認值是一個空object對象

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

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

–運行順序: 定義構造函數=>創造實例對象=>給原型添加方法=>通過實例調用原型的方法

原型鏈

1.訪問一個對象的屬性時:

–先在自身屬性中查找,找到返回。如果沒有,再沿着__proto__這條鏈向上查找,找到返回。如果最終沒有找到,返回undefined(隱式原型鏈)

Object的原型對象是原型鏈的盡頭

–作用:查找對象的屬性(方法)

另(查找變量看作用域鏈)

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

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

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

function Fun(){} 相當於(var Fun = new Function())

Function = new Function() (所有函數的__proto__ 都是一樣的)

4.原型繼承

–構造函數的實例對象自動擁有構造函數原型對象的屬性(利用原型鏈)

原型鏈–屬性問題

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

2.設置對象的屬性值時:不會查找原型鏈,如果當前對象中沒有此屬性,直接添加此屬性並設置其值

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

instanceof是如何判斷的

–表達式 A instanceof B

– 如果B函數的顯式原型對象再A對象的原型鏈上,返回true,否則返回false

–Function是通過new自己產生的實例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章