p. JavaScript繼承和重寫(xiě)是面向?qū)ο缶幊讨兄陵P(guān)重要的概念,它們?cè)试S我們復(fù)用代碼,并且允許我們?cè)诨?lèi)的代碼上建立并擴(kuò)展子類(lèi)的新代碼。
p. 在JavaScript中,繼承是使用原型鏈來(lái)實(shí)現(xiàn)的。原始的繼承方法是通過(guò)在子類(lèi)原型中設(shè)置父類(lèi)的實(shí)例來(lái)完成的。例如:
function Person(name) { this.name = name; } Person.prototype.greeting = function() { return 'Hello, my name is ' + this.name; }; function Student(name) { Person.call(this, name); } Student.prototype = Object.create(Person.prototype); Student.prototype.constructor = Student;上述代碼中,我們創(chuàng)建了一個(gè)Person類(lèi)和Student類(lèi)。Student類(lèi)繼承自Person類(lèi)。在這個(gè)例子中,我們使用Person類(lèi)的實(shí)例來(lái)設(shè)置Student類(lèi)的原型。我們還將Student類(lèi)的構(gòu)造函數(shù)設(shè)置回本身。 p. 重寫(xiě)是子類(lèi)中重寫(xiě)基類(lèi)方法的過(guò)程。讓我們?cè)谏厦娴拇a中添加一個(gè)新的方法greeting。我們將重寫(xiě)Person類(lèi)中的greeting方法。這是我們可以通過(guò)以下方式實(shí)現(xiàn):
function Student(name) { Person.call(this, name); } Student.prototype = Object.create(Person.prototype); Student.prototype.constructor = Student; Student.prototype.greeting = function() { return 'Hey there! My name is ' + this.name; };在上面的代碼片段中,我們?cè)赟tudent類(lèi)的原型中重寫(xiě)了greeting方法。當(dāng)我們實(shí)例化一個(gè)Student類(lèi)并調(diào)用greeting時(shí),它將返回“Hey there! My name is XXX”。 p. 這種重寫(xiě)方法之所以行得通,是因?yàn)樵玩湣.?dāng)我們調(diào)用Student實(shí)例的greeting時(shí),它先檢查Student的原型,如果沒(méi)有找到,繼續(xù)檢查Person的原型。如果依然沒(méi)有找到,它將繼續(xù)檢查Object的原型。最終,如果Object原型都沒(méi)有結(jié)果,它將返回undefined,因?yàn)檫@是JavaScript查找失敗時(shí)的默認(rèn)返回值。 p. 當(dāng)然,在實(shí)踐中,我們也可以通過(guò)使用ES6的類(lèi)和擴(kuò)展關(guān)鍵字來(lái)實(shí)現(xiàn)繼承和重寫(xiě)。這是我們可以通過(guò)以下方式重寫(xiě)上面的代碼:
class Person { constructor(name) { this.name = name; } greeting() { return 'Hello, my name is ' + this.name; } } class Student extends Person { greeting() { return 'Hey there! My name is ' + this.name; } }這段代碼產(chǎn)生與上面的原型鏈?zhǔn)纠嗤慕Y(jié)果。這有助于提高可讀性,尤其是對(duì)于已經(jīng)習(xí)慣了傳統(tǒng)OOP語(yǔ)言的開(kāi)發(fā)者。 p. 繼承和重寫(xiě)是JavaScript中關(guān)鍵的概念,無(wú)論您選擇使用原型鏈還是類(lèi)擴(kuò)展語(yǔ)法,都可以有效地實(shí)現(xiàn)它們。熟練掌握這些概念對(duì)于成為一名更好的JavaScript開(kāi)發(fā)者是非常重要的。