理解原型和原型鏈

構造函數、實例、原型、原型鏈

構造函數

構造函數就是一個普通的函數,建立方式和普通函數沒有區別,不一樣的是構造函數習慣上首字母大寫。另外就是調用方式的不一樣,普通函數是直接調用,而構造函數須要使用new關鍵字來調用。bash

function Person() {};
var person = new Person();
複製代碼

實例

實例就是經過構造函數建立出來的對象。函數

原型

每當定義一個函數數據類型(普通函數、類)時候,都會天生自帶一個prototype屬性,這個屬性指向函數的原型對象,而且這個屬性是一個對象數據類型的值。 spa

原型與構造函數的關係就是,構造函數內部有一個名爲 prototype 的屬性,經過這個屬性就能訪問到原型:

原型對象就至關於一個公共的區域,全部同一個類的實例均可以訪問到這個原型對象,咱們能夠將對象中共有的內容,統一設置到原型對象中。prototype

原型鏈

指從一個實例對象開始往上找,這個實例對象的__proto__屬性所指向的則是這個實例對象的原型對象,若是用person表示這個實例,則原型對象表示爲person.proto。同時,這個原型對象顧名思義也是一個對象,並且它也有上一級的原型對象,相對於上一級原型對象而言,它也是一個實例對象,那麼它也擁有__proto__屬性,它的__proto__屬性也指向它的原型對象,後面也以此類推,一直到Object.prototype這個原型爲止,Object.prototype爲原型鏈的末尾點。3d

person經過調用兩次__proto__屬性就已經到達Object,Object是一個構造函數,Object擁有屬性prototype,能夠指向它的原型。第三次調用的時候已經返回空,代表Object.prototype爲原型鏈的末端。

Person是構造函數, Person.prototype 是原型對象, person是實例, 實例能夠經過_proto_找到原型對象。code

Example

function A() {}
A.prototype.type = 'AAA'

function B() {}
B.prototype = new A()

b = new B()
console.log(b.__proto__.__proto__.type) //AAA
console.log(B.prototype.__proto__ == b.__proto__.__proto__) //true
console.log(A.prototype == b.__proto__.__proto__) //true
console.log(A.prototype == B.prototype.__proto__) //true
console.log(b.__proto__.__proto__.type == A.prototype.type) //true
    
複製代碼

若是感受對你有幫助,那就收藏❤❤吧!cdn

相關文章
相關標籤/搜索