JavaScript 原型與原型鏈是 JavaScript 中最基礎和最重要的知識點之一。理解這個概念可以幫助我們更好的理解 JavaScript 的運作機制。
在 JavaScript 中每個對象都有一個原型,原型是一個對象,可以包含屬性和方法。當一個對象需要訪問一個不存在于自身屬性的屬性或方法時,它會去訪問原型鏈中的對象,直到找到為止。
// 舉例 var person = {name: "Tom"}; console.log(person.hasOwnProperty('name')); // true console.log(person.hasOwnProperty('toString')); // false
上面的代碼中,person 對象有一個原型對象,它是 Object.prototype。盡管我們沒有為 person 對象定義 toString 方法,但它還是能找到它,因為在 person 的原型鏈中可以找到。
每創建一個對象時,它就會創建一個指向其構造函數(constructor)的 prototype 屬性。所有從同一個構造函數創建的對象都指向同一個 prototype 對象。
// 舉例 function Person(name) { this.name = name; } var person1 = new Person('Tom'); var person2 = new Person('Jerry'); console.log(person1.__proto__ === Person.prototype); // true console.log(person2.__proto__ === Person.prototype); // true
上面的代碼中,person1 和 person2 的原型都是 Person.prototype。
原型鏈是由多個對象組成的,每個對象都有一個鏈接到它的原型對象。這樣的鏈條就變成一個鏈狀結構,稱為原型鏈。
// 舉例 function Person() {} function Student() {} Student.prototype = Object.create(Person.prototype); var s = new Student(); console.log(s instanceof Person); // true console.log(s instanceof Student); // true
上面的代碼中,我們將 Student 的 prototype 屬性設置為一個新的 Person 對象。這樣,Student 的原型就鏈接到了 Person 的原型,形成一個原型鏈。這也解釋了為什么實例對象可以從它的父類繼承屬性和方法。
在 JavaScript 中,有一些內置的對象,比如 Array、String、Number 等。它們實際上都是函數對象,這意味著它們都有一個 prototype 屬性。當我們使用這些對象創建實例時,它們都鏈接到這些對象的原型。這也解釋了為什么 JavaScript 中的 Array、String、Number 等都有一些可供實例使用的方法和屬性。
總之,JavaScript 的原型與原型鏈是一種非常強大的機制,可以使你的代碼更加有效和簡潔。理解這個概念可以幫助你更好的理解和使用 JavaScript。