__proto__ 、prototype、constructor ...
首先 先解釋這三個屬性:
(1) prototype : 它是函數獨有的,從一個函數指向一個對象(函數的原型),含義是函數的原型對象,也就是這個函數所創建的實例的原型對象。(普通函數的該屬性沒有作用)
作用:讓每一個實例共用同一套方法。(prototype就是用來盛放所有的構造函數的實例的方法的,prototype屬性上的所有內容都可以被構造函數的實例去調用)
(2) __proto__ : 它是對象獨有的,從一個對象指向一個對象。(即指向他們的原型對象,可以理解為父對象)
作用:當訪問一個對象的屬性時,如果該對象內部不存在這個屬性,那麼就會去它的__proto__屬性所指向的那個對象(可以理解為父對象)里找,如果父對象也不存在這個屬性,則繼續往父對象的__proto__屬性所指向的那個對象(可以理解為爺爺對象)里找,如果還沒找到,則繼續往上找….直到原型鏈頂端null(可以理解為原始人。。。),此時若還沒找到,則返回undefined(可以理解為,再往上就已經不是“人”的範疇了,找不到了,到此為止)。由以上這種通過__proto__
屬性來連接對象直到null
的一條鏈即為我們所謂的原型鏈。
(3)constructor : 它是對象獨有的, 從一個對象指向一個對象。(即指向該對象的構造函數),每個對象都有構造函數。所有函數最終都是由Function()構造函數得來,所以constructor
屬性的終點就是Function()。
註意:Function這個對象比較特殊,它的構造函數就是它自己(因為Function可以看成是一個函數,也可以是一個對象)。
總結:
⑴ __proto__
和constructor
屬性是對象所獨有的;
⑵ prototype
屬性是函數所獨有的,因為函數也是一種對象,所以函數也擁有__proto__
和constructor
屬性。(即只有函數有prototype屬性,其餘兩個函數對象都有。)
⑶ constructor
屬性的含義就是指向該對象的構造函數,所有函數(此時看成對象了)最終的構造函數都指向Function()。
Object、Array、Function 的關係:
(1) 函數是一種對象。
(2) 對象都是通過函數創建的
(3) Object 是一切引用類型的父類,所有能被Object接收的均為對象(數組是一種對象)
引用數據類型:Object 、Array 、Function 、Data等。
有人說,Object類型相當於哺乳動物,Array相當於犬科動物,Function相當於貓科動物,他們分別是一種狗,一種貓,一種豬,一種鴨。他們彼此之間並無直接聯繫,但同屬動物(引用類型)。