JavaScript 是一門基于原型鏈的面向?qū)ο笳Z言。在 JavaScript 中,常常需要利用原型鏈來實(shí)現(xiàn)面向?qū)ο缶幊讨欣^承的相關(guān)操作。所以,原型鏈與繼承的概念是非常重要的。
在 JavaScript 中,每一個(gè)對象都有一個(gè)指向它原型的引用。這個(gè)原型又是一個(gè)對象,并且它也有自己的原型。這樣,我們就可以形成一個(gè)原型鏈,依次連接每一個(gè)對象的原型。一個(gè)原型鏈的示意圖如下:
Object.prototype | Function.prototype | person.prototype | person
上述原型鏈中包含了對象 person、person.prototype、Function.prototype 和 Object.prototype。其中 Object.prototype 是所有 JavaScript 對象的祖先。我們可以使用對象的 __proto__ 屬性(或 Object.getPrototypeOf() 方法)來獲取當(dāng)前對象的原型。例如:
var person = {name: "Jack"}; var personPrototype = Object.getPrototypeOf(person); console.log(personPrototype === Object.prototype); // true
在 JavaScript 的原型鏈中,當(dāng)我們訪問一個(gè)對象的屬性時(shí),首先會查找對象本身是否包含該屬性,如果沒有找到,則會沿著原型鏈往上查找,直到找到為止。如果整個(gè)原型鏈上依然沒有找到該屬性,則返回 undefined。
var person = {name: "Jack"}; var personPrototype = Object.getPrototypeOf(person); console.log(personPrototype === Object.prototype); // true console.log(person.toString()); // "[object Object]" console.log(person.toLocaleString()); // "[object Object]"
上述代碼中,我們嘗試調(diào)用對象 person 不存在的 toString() 和 toLocaleString() 方法。由于 person 對象本身沒有這兩個(gè)方法,所以 JavaScript 默認(rèn)會去 person.prototype 中查找。通過原型鏈,它最終找到了 Object.prototype 中的 toString() 和 toLocaleString() 方法并返回。
在 JavaScript 中,原型也是對象。對象可以通過它的 prototype 屬性來繼承另一個(gè)對象的屬性和方法。下面的代碼演示了如何通過原型繼承實(shí)現(xiàn)一個(gè)簡單的類繼承關(guān)系:
// 定義一個(gè)基礎(chǔ)類 function Animal(name) { this.name = name; } Animal.prototype.speak = function() { console.log(this.name + " makes a noise."); } // 定義一個(gè)派生類 function Dog(name) { Animal.call(this, name); } Dog.prototype = Object.create(Animal.prototype); Dog.prototype.constructor = Dog; Dog.prototype.speak = function() { console.log(this.name + " barks."); }
上述代碼中,我們定義了一個(gè)基礎(chǔ)類 Animal 和一個(gè)繼承自 Animal 的派生類 Dog。我們通過調(diào)用 Animal.call(this, name) 來繼承 Animal 中基本的屬性和方法。然后,我們通過 Object.create() 方法來繼承 Animal.prototype 上的屬性和方法,并將它們賦值給 Dog.prototype。最后,我們通過重新定義 Dog.prototype.speak() 方法來覆蓋 Animal.prototype.speak() 的實(shí)現(xiàn)。
總而言之,原型鏈與繼承的概念是 JavaScript 面向?qū)ο缶幊讨蟹浅V匾幕A(chǔ)概念。對于熟練使用 JavaScript 編程的開發(fā)人員來說,掌握原型鏈與繼承的相關(guān)操作是非常有必要的。