JS 中的 __proto__ 、prototype、constructor
首先 先解釋這三個屬性:
(1) 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相當於貓科動物,他們分別是一種狗,一種貓,一種豬,一種鴨。他們彼此之間並無直接聯絡,但同屬動物(引用型別)。