上面這張圖出自 冴羽的博客,這張圖已經能很好地解釋原型與原型鏈了,其涉及到的屬性以下:node
prototype
: 每一個函數都有一個 prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含能夠由特定類型的全部實例共享的屬性和方法,若是使用這個函數生成了實例,那麼稱這個對象爲全部實例的原型。__proto__
: 每一個對象都擁有__proto__
屬性,該屬性用於實現原型鏈,當訪問一個對象的屬性時,若是該對象內部不存在這個屬性,就經過原型鏈找直到找到或者到終點 null。constructor
:每一個原型都有一個 constructor 屬性指向關聯的構造函數
咱們能夠用下面這段代碼驗證一下:git
function Person () { } let person = new Person() console.log(person.__proto__ === Person.prototype) // true console.log(Person.prototype.constructor === Person) // true console.log(Person.prototype.__proto__ === Object.prototype) // true
下面這張圖咱本身畫的,主要是分析下 Object 與 Function 的原型問題: 全部的對象都是由 Object() 構造函數構造的,全部的函數聲明 / 函數表達式都是 Function() 構造函數的實例,而 Object() 構造函數自己又是 Function() 構造函數的實例,其原型關係以下: github
須要注意的是 Function() 的__proto__
屬性直接指向的是其原型對象。 咱們能夠用下面的代碼來驗證這張圖:在 node 環境及瀏覽器環境下都是同樣的結果瀏覽器
console.log(Object.__proto__ === Function.prototype) // true console.log(Function.__proto__ === Function.prototype) // true console.log(Function.prototype.__proto__ === Object.prototype) // true console.log(Object.prototype.__proto__ === null) // true