JavaScript作為一門面向對象的編程語言,原型鏈是其最為基礎的概念之一,也是與其他語言最為不同的特性之一。本文將會從原型鏈的起源開始,探討JavaScript 原型鏈的本質以及其重要性。
JavaScript中的原型鏈是由原型對象構成的,每一個JavaScript對象都具有一個prototype屬性,這個屬性指向該對象的原型對象。當一個對象調用一個方法或者屬性時,如果該對象自身沒有該方法或屬性的話,則會去其原型對象中查找,如果還沒有找到則會繼續往上查找直到最終的頂層原型對象Object.prototype。
let person = { name: "張三", age: 20 } console.log(person.__proto__ === Object.prototype) // true
上述代碼中,我們定義了一個名為person的對象,該對象包含name和age兩個屬性。此外,通過person.__proto__我們可以得到該對象的原型對象,該原型對象就是Object.prototype。
原型鏈的重要性在于,它讓每一個JavaScript對象都可以繼承其原型對象中的方法和屬性。當我們需要使用一個對象的方法或屬性時,JavaScript引擎首先會在該對象中查找,如果沒找到則會繼續在其原型對象中查找,如此循環下去直到找到或者到達頂層原型對象。
let person = { name: "張三", age: 20, sayHello() { console.log("你好,我是" + this.name + ",今年" + this.age + "歲。") } } let student = { grade: 3 } student.__proto__ = person student.sayHello() // 你好,我是undefined,今年undefined歲。
上述代碼中,我們定義了一個person對象,其中包含了一個sayHello方法。接著我們定義了一個student對象,該對象通過student.__proto__繼承了person對象。然而,在我們調用student.sayHello()方法時,控制臺輸出的結果與我們所期望的結果不符,原因在于this指向的是當前對象即student,而student對象中并沒有name和age屬性,因此得到了undefined。
總的來說,JavaScript原型鏈的本質就是通過原型對象之間的鏈接來實現對象之間的繼承關系,使得每一個JavaScript對象都可以繼承其原型對象中的方法和屬性。了解原型鏈不僅是JavaScript基礎中的重要一環,也是深入掌握面向對象編程的必備知識之一。