本文主要用於記載本身讀《你不知道的Javascript》後,對原型,原型鏈的理解。可能有些偏頗,歡迎批評指正。函數
書中提到如下內容:prototype
在Javascript中,函數自己並非構造函數。然而,當你在普通的函數面前加上new關鍵字以後,就會把這個函數調用變成一個「構造函數」調用。
實際上, new會劫持全部的普通函數並用構造對象的形式調用它。
function A() {
}
let a = new A();
上面提到 let a = new A()
實際上,上面這句statement並不單單是建立了一個a對象,同時它還委託了一個關聯
能夠看到,這個關聯就是 A.prototype。 它是一個對象,這個對象有兩個屬性,一個是 constructor, 一個是 __proto__ (傻瓜原型,雙下劃線原型 dunder proto)。而constructor屬性關聯到 funtion A(){}code
與此同時,這句statement還委託了另外一個關聯, 那就是 a.__proto__ 關聯到 A.prototype。能夠看到a.__proto__與上面的A.prototype是相同的,下面會用代碼證實它們是相同的引用。對象
a.__proto__ === A.prototype, a.constructor === A.prototype.constructorblog
事實上,對象a自己並無constructor屬性,該constructor屬性是它的關聯__proto__所指向的對象A.prototype的屬性 A.prtotype.constructorip
[[prototype]]機制就是存在於對象中的一個內部連接,這個連接的做用是: 若是對象上沒有找到須要的屬性或者方法引用,引擎就會繼續在[[prototype]]關聯的對象上進行查找。同理,若是在後者中也沒有找到須要的引用就會繼續查找它的[[prototype]],以此類推。這一系列對象的連接被稱爲「原型鏈」