1、對象都是由函數(shù)創(chuàng)建出來的
例如:var a= new Object();var b=new Function();var c=new Array();像這些Object、Function、Array都是函數(shù)。
在實(shí)際工作中我們是這樣寫的var a={};var b=function(){};var c=[];;這兩者本質(zhì)上是沒有任何區(qū)別的,后者只是一種快捷方式,在編程語言中,一般叫做“語法糖”。
2、函數(shù)也是對象(雞生蛋還是蛋生雞的問題了)
函數(shù)也是對象,并且有一個(gè)默認(rèn)的屬性prototype。
看下圖:

Paste_Image.png
我們創(chuàng)建了一個(gè)superType函數(shù),可以看到superType.prototype也是一個(gè)對象:
superType.prototype={
constructor:function(),
__proto__:Object
}
這個(gè)對象有兩個(gè)屬性,其中constructor指向一個(gè)函數(shù),這個(gè)函數(shù)即是superType。

Paste_Image.png
另外一個(gè)屬性__proto__的值則是一個(gè)對象。
3、每個(gè)函數(shù)function都有一個(gè)
prototype,即原型;每個(gè)對象都有一個(gè)__proto__
每個(gè)對象的__proto__都指向創(chuàng)建該對象的函數(shù)——的prototype。
一步一步來:
- 創(chuàng)建該對象的函數(shù):可以是
Array、Object、Fucntion或者自定義的函數(shù). - 上一步函數(shù)的
prototype。
4、
Object.prototype的__proto__指向null
這個(gè)對象(Object.prototype)的__proto__屬性是個(gè)特例。否則的話就就無休止了。
結(jié)合上面幾點(diǎn)來理解下面這張圖片

Paste_Image.png