建構函式、例項、原型、原型鏈
建構函式
建構函式就是一個普通的函式,建立方式和普通函式沒有區別,不同的是建構函式習慣上首字母大寫。另外就是呼叫方式的不同,普通函式是直接呼叫,而建構函式需要使用new關鍵字來呼叫。
function Person() {};
var person = new Person();
複製程式碼
例項
例項就是通過建構函式建立出來的物件。
原型
每當定義一個函式資料型別(普通函式、類)時候,都會天生自帶一個prototype屬性,這個屬性指向函式的原型物件,並且這個屬性是一個物件資料型別的值。
原型與建構函式的關係就是,建構函式內部有一個名為 prototype 的屬性,通過這個屬性就能訪問到原型:原型物件就相當於一個公共的區域,所有同一個類的例項都可以訪問到這個原型物件,我們可以將物件中共有的內容,統一設定到原型物件中。
原型鏈
指從一個例項物件開始往上找,這個例項物件的__proto__屬性所指向的則是這個例項物件的原型物件,如果用person表示這個例項,則原型物件表示為person.proto。同時,這個原型物件顧名思義也是一個物件,而且它也有上一級的原型物件,相對於上一級原型物件而言,它也是一個例項物件,那麼它也擁有__proto__屬性,它的__proto__屬性也指向它的原型物件,後面也以此類推,一直到Object.prototype這個原型為止,Object.prototype為原型鏈的末尾點。
person通過呼叫兩次__proto__屬性就已經到達Object,Object是一個建構函式,Object擁有屬性prototype,可以指向它的原型。第三次呼叫的時候已經返回空,表明Object.prototype為原型鏈的末端。Person是建構函式, Person.prototype 是原型物件, person是例項, 例項可以通過_proto_找到原型物件。
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
複製程式碼
如果感覺對你有幫助,那就收藏❤❤吧!