在JavaScript中,類的繼承是一種重要的面向?qū)ο缶幊谈拍睢n惖睦^承可以讓我們通過創(chuàng)建一個(gè)新類來(lái)擴(kuò)展現(xiàn)有類的功能,而不必重復(fù)編寫相同的代碼。
舉個(gè)例子,假設(shè)我們有一個(gè)動(dòng)物類Animal,它有一些基本屬性和方法:
class Animal { constructor(name, age) { this.name = name; this.age = age; } speak() { console.log('I am an animal'); } }現(xiàn)在我們想創(chuàng)建一個(gè)Cat類,并讓它繼承Animal類。這樣,Cat類將會(huì)有Animal類的所有屬性和方法。
class Cat extends Animal { constructor(name, age, color) { super(name, age); this.color = color; } speak() { console.log('Meow'); } }在上面的代碼中,我們使用extends關(guān)鍵字創(chuàng)建了一個(gè)新類Cat,并讓它繼承了Animal類。我們也可以看到Cat類的構(gòu)造函數(shù)使用了super關(guān)鍵字來(lái)調(diào)用Animal類中的構(gòu)造函數(shù),并且還添加了一個(gè)顏色屬性。此外,我們還重寫了speak()方法,所以Cat類將會(huì)用自己的聲音來(lái)說(shuō)話。 現(xiàn)在,我們創(chuàng)建一個(gè)Cat類的實(shí)例,可以看到它擁有Animal類的所有屬性和方法,以及Cat類自己的屬性和方法:
const garfield = new Cat('Garfield', 3, 'orange'); console.log(garfield.name); // 'Garfield' console.log(garfield.age); // 3 console.log(garfield.color); // 'orange' garfield.speak(); // 'Meow'我們可以看到,garfield實(shí)例繼承了Animal類的name和age屬性,并且還有自己的color屬性。此外,它也繼承了Animal類的speak()方法,但是Cat類重寫了此方法,所以調(diào)用speak()方法時(shí)會(huì)輸出'Meow'而不是'I am an animal'。 除了extends關(guān)鍵字之外,JavaScript還提供了多重繼承的機(jī)制,也就是一個(gè)類可以同時(shí)繼承多個(gè)類的屬性和方法。我們可以使用mixins來(lái)實(shí)現(xiàn)這個(gè)功能。 舉個(gè)例子,假設(shè)我們有一個(gè)CanSwim的mixin:
const CanSwim = { swim() { console.log('Swimming...'); } };現(xiàn)在我們想讓Cat類繼承CanSwim的swim()方法,并且也繼承Animal類的屬性和方法。我們可以這樣做:
class Cat extends Animal { constructor(name, age, color) { super(name, age); this.color = color; } speak() { console.log('Meow'); } } Object.assign(Cat.prototype, CanSwim); const garfield = new Cat('Garfield', 3, 'orange'); garfield.swim(); // 'Swimming...'在上面的代碼中,我們使用Object.assign()方法將CanSwim的swim()方法添加到Cat類的原型中。這樣,我們就能在Cat類的實(shí)例中使用swim()方法了。 總之,類的繼承是JavaScript中重要的面向?qū)ο缶幊谈拍钪弧Mㄟ^繼承,我們可以輕松地?cái)U(kuò)展現(xiàn)有類的功能,避免重復(fù)編寫相同的代碼。同時(shí),mixins機(jī)制也讓我們能夠?qū)崿F(xiàn)多重繼承的需求。