JavaScript中的復寫是在“子類”中重新定義“父類”中已經定義的函數或方法。在編寫代碼時,我們用子類的方法覆蓋了父類的方法,讓它執行特定的任務。
例如,讓我們考慮一個簡單的貓類:class Cat { constructor(name) { this.name = name; } speak() { console.log(this.name + ' makes a noise.'); } }
我們現在創建了一個子類Persian,對父類中的方法進行了復寫:
class Persian extends Cat { speak() { console.log(this.name + ' meows.'); } }
現在,當我們實例化Persian并調用方法時,將打印“Fluffy meows.”而不是“Fluffy makes a noise.”:
let fluffy = new Persian('Fluffy'); fluffy.speak(); // 輸出 "Fluffy meows."
我們也可以在復寫函數中訪問與父類相同方法的屬性和方法:
class Persian extends Cat { speak() { super.speak(); console.log(this.name + ' meows.'); } }
上面的代碼將打印“Fluffy makes a noise.”和“Fluffy meows.”,因為super.speak()調用了父類的speak方法。
現在讓我們看一個現實世界的例子。假設我們要在我們的網站上顯示一個“實時”時鐘,該時鐘將在頁面上不斷更新。我們可以創建一個Clock類來管理時鐘的所有細節:
class Clock { constructor(time) { this.time = time; } update() { this.time.setTime(this.time.getTime() + 1000); this.printTime(); } printTime() { console.log(this.time.toLocaleTimeString()); } }
現在,我們想要創建一個時鐘,該時鐘具有自己的update方法,以更新頁面上的時間:
class DigitalClock extends Clock { constructor(time) { super(time); this.printTime(); setInterval(() =>this.update(), 1000); } printTime() { let hours = this.time.getHours(); let minutes = this.time.getMinutes(); let seconds = this.time.getSeconds(); hours = hours< 10 ? '0' + hours : hours; minutes = minutes< 10 ? '0' + minutes : minutes; seconds = seconds< 10 ? '0' + seconds : seconds; console.log(`${hours}:${minutes}:${seconds}`); } }
這里的DigitalClock類復寫了父類Clock中的printTime方法,以獲取與數字時鐘相適應的格式化時間。由于DigitalClock類有自己的update方法,我們可以使用setInterval函數來調用它,以每秒鐘更新一次時間。
JavaScript中的復寫是面向對象編程的一個強大且有用的概念。利用這個概念,我們可以創建具有我們想要的特定行為的自定義對象。