原型與原型鏈 – 對象與函數關係筆記

鋪墊

__proto__和constructor屬性是對象所獨有的,prototype屬性是函數所獨有的

在JS中函數也是一種對象,函數也擁有__proto__和constructor屬性

對象由函數生成。生成對象時,對象的__proto__屬性指向函數的prototype屬性

演示代碼

function Foo(){...};

var f1 = new Foo();

創建一個構造函數Foo(),並用new關鍵字實例化,得到實例化對象f1

類型的原型(prototype)

prototype是函數所獨有的,它是從一個函數指向一個對象,所指的對象就是函數的原型對象

作用: 讓函數所實例化的對象都可以找到公用的屬性和方法

幾乎所有的函數在創建時,會默認創建該函數的prototype對象

原型(proto

__proto__屬性是對象所擁有的,__proto__屬性都是由一個對象指向另一個對象,也就是指向它們的原型對象(也可以理解為父對象)

作用: 當訪問一個對象的屬性時,如果該對象內部不存在這個訪問的屬性,則會去它的__proto__屬性所指的對象(父對象)里尋找,如果父對象不存在這個屬性,則繼續往祖先對象的__proto__所指的對象(爺爺對象)里尋找,一直往上尋找…直到原型鏈頂端null,此時如果繼續往上相當於在null上取屬性,系統就會報錯(null可以理解為原型鏈的終點,到該點時結束),以上從訪問的對象到null的一條鏈,我們稱為原型鏈

我們平時調用多數方法都是靠__proto__繼承的

prototype所指的函數原型對象和__proto__所指原型對象是不同的

構造函數(constructor)

Constructor也是對象才擁有的,他是由一個對象指向函數,指向該對象的構造函數,每個對象都有構造函數(本身擁有或繼承,繼承要結合__proto__屬性查看),Function這個對象的構造函數是它自己本身,所有函數和對象最終都是由Funtion構造函數得來的,Constructor屬性的終點即為Function這個函數

原型與原型鏈

這些圖都是本人自己做的,轉載請帶上鏈接,謝謝配合