理解關(guān)于Function的原型鏈問題
- 關(guān)于Function的原型鏈問題的一些個人粗略理解,歡迎指正錯誤的地方
要理解Function的原型鏈的問題
首先深入理解__proto__
__proto__
的含義是 實例對象指向?qū)嵗?/strong>!!
實例的原型對象就是構(gòu)造函數(shù).prototype
例如
function Person() {
}
var person = new Person();
console.log(person.__proto__ === Person.prototype); // true
所以:
- 每一個JavaScript對象(除了 null )都具有的一個屬性,叫
__proto__
腊敲,這個屬性會指向該對象的原型(對象)。 - 每個函數(shù)都有一個
prototype
屬性,構(gòu)造函數(shù)指向?qū)嵗?如下圖
CUDACF.png
重點理解: 實例對象.__proto__指向?qū)嵗蛯ο?/code>
參考原博客proto的那個部分
挖來下圖
理解之后我們來看 Function
1
在聲明函數(shù)的時候
有一種聲明方法是Function 構(gòu)造函數(shù)
下面參考阮一峰
第三種聲明函數(shù)的方式是Function
構(gòu)造函數(shù)俐载。
var add = new Function(
'x',
'y',
'return x + y'
);
// 等同于
function add(x, y) {
return x + y;
}
也就是說Function
是一個構(gòu)造函數(shù),用來生成函數(shù)的構(gòu)造函數(shù).那么,String()
,Boolean()
,Number()
這些函數(shù)都是Function
構(gòu)造出來的,new
出來的,也就是說String()
,Boolean()
,Number()
這些函數(shù)(函數(shù)也是廣義對象)是Function
的實例對象.那么 實例對象.__proto__指向?qū)嵗蛯ο?/code>
也就是說
String.__proto__===Function.prototype//true
Number.__proto__===Function.prototype//true
Boolean.__proto__===Function.prototype//true
Object.__proto__ === Function.prototype//true
不只是上述構(gòu)造函數(shù),實際上,
任意函數(shù)的__proto__都===Function.prototype
即
所有函數(shù).__proto__===Function.Prototype
因為任意函數(shù)都是Function()
new
(構(gòu)造)出來的.
任意函數(shù)都是Function()
構(gòu)造函數(shù)的實例
關(guān)于Function
最奇特 的是
Function.__proto__===Function.Prototype//true
因為 所有函數(shù)實例.__proto__就是Function構(gòu)造函數(shù)的原型(Function.Prototype)
,函數(shù)而函數(shù)實例也包括他自己.
深入理解:
-
Function
作為一個函數(shù)對象實例,他有__proto__
,指向原型 -
Function
又作為一個構(gòu)造函數(shù),他有自己的protoype
,指向原型
所以
CUrKMj.png
而
Function.__proto__===Object.Protoype//false
也就是說
更深層次的理解:
- Function優(yōu)先是一個函數(shù)實例
- 自身是構(gòu)造函數(shù),自身又是自身構(gòu)造函數(shù)的實例
- 其次才是廣義的對象.
2
Function
也可以看作是String()
或者Boolean()
或Number()
同等地位
因為所有函數(shù).prototype
雖然是實例原型,但是實例原型本質(zhì)還是一個對象,也就是說所有的實例原型對象是Object()
構(gòu)造函數(shù)的實例,即
String.prototype.__proto__=== Object.prototype//true
Number.prototype.__proto__=== Object.prototype//true
Boolean.prototype.__proto__=== Object.prototype//true
//同理
Function.prototype.__proto__=== Object.prototype//true
```
`Function`總結(jié):
- 如果把函數(shù)看成對象褂萧,那么`函數(shù).__proto__ === Function.prototype`
- 如果把 `Function` 看成對象嗽桩,那么 `Function.__proto__ === Function.prototype`
## 最終總結(jié)
```
實例對象.__proto__===構(gòu)造函數(shù).prototype
```
其中實例對象是構(gòu)造函數(shù)構(gòu)造的實例.
原型鏈:
每層的`__proto__`都指向上一層的原型,所以一層一層的`__proto__`組成的鏈就成為原型鏈.
最終
```
Object.prototype.__proto__
//null
```