學事後臺語言的都知道類、繼承等面向對象思想,其實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 我的筆記 公衆號對象