函數的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自己產生的實例