原型鏈prototype

學事後臺語言的都知道類、繼承等面向對象思想,其實JavaScript也是一種面向對象的語言,只是平時開發時幾乎不須要用到,也沒有提供傳統的基於類的繼承系統,致使如今幾乎沒多少人知道原型鏈這個東西。但其實,原型鏈是JavaScript的核心之一,也是一個難點。bash

在JavaScript中,最普通的對象有__proto__屬性(指向其原型鏈),沒有prototype屬性,原型對象還有constructor屬性(指向構造函數對象))。事實上,prototype是函數纔有的屬性,_proto_是每一個對象都有的屬性,而JavaScript裏萬物皆對象,因此會造成_proto_連起來的鏈條,這就是原型鏈。函數

function fun() {

}

console.log(fun.prototype);
複製代碼

當咱們聲明一個空函數,打印一下他的原型鏈prototype,能夠看見這個函數是默認有constructor和_proto_這兩個屬性的,而且原型鏈的末尾指向的是null爲原型的對象。當咱們訪問某個屬性的時候,它會經過原型鏈一層一層向上查找,一直找到null尚未,就會返回undefined。this

console.log(fun.prototype.a);  //undefined
複製代碼

當你想要定義這個原型鏈上的某個屬性的時候,必須使用prototypespa

function fun() {

}

fun.prototype.a = 0; //輸出0

fun.a = 0;  //輸出undefined

console.log(fun.prototype.a);
複製代碼

所以,當你new一個對象出來,訪問某個屬性的時候,是同樣的,必須使用prototype才能聲明某個屬性,或者是方法內部調用this聲明。prototype

function fun() {
this.b = 1;//此時this會指向聲明的對象,下面的obj,obj的對象原型會指向構造器的prototype,至關於fun.prototype。
}
fun.prototype.a = 0; //輸出0

fun.a = 0;  //輸出undefined

var obj = new fun();
console.log(obj.a);

console.log(obj.b);
複製代碼

還能夠打印輸出obj,其實obj裏面繼承了不少原型鏈上的屬性。以上就是JavaScript的原型鏈。code

歡迎關注 Coding 我的筆記 公衆號對象

相關文章
相關標籤/搜索