Sınıflar başka sınıfları genişletebilirler. Bunun için prototip kalıtımı tabanlı güzel bir yazılışı bulunmaktadır.
Diğer bir sınıftan kalıtım sağlamak için "extends" ile belirtmek gerekmektedir.
Aşağıda Animal’dan kalıtım alan Rabbit sınıfı gösterilmektedir:
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
run(speed) {
this.speed += speed;
alert(`${this.name} runs with speed ${this.speed}.`);
}
stop() {
this.speed = 0;
alert(`${this.name} stopped.`);
}
}
// Inherit from Animal
class Rabbit extends Animal {
hide() {
alert(`${this.name} hides!`);
}
}
let rabbit = new Rabbit("White Rabbit");
rabbit.run(5); // White Rabbit runs with speed 5.
rabbit.hide(); // White Rabbit hides!
extends kelimesi aslında Rabbit.prototype’dan referans alıp bunun [[Prototype]]'ını Animal.prototype’a ekler. Aynen daha önce de gördüğümüz gibi.
Artık rabbit hem kendi metodlarına hem de Animal metodlarına erişebilir.
extends’ten sonra her türlü ifade kullanılabilir.Extends’ten sonra sadece sınıf değil her türlü ifade kullanılabilir.
Örneğin, üst sınıfı yaratan yeni bir fonksiyon çağrısı:
function f(phrase) {
return class {
sayHi() { alert(phrase) }
}
}
class User extends f("Hello") {}
new User().sayHi(); // Hello
Burada class User f("Hello")'nun sonucunu kalıtır.
Bu belki çok ileri teknik programlama kalıpları için kullanışlı olabilir. Böylece birçok koşula göre fonksiyonları kullanarak farklı sınıflar oluşturabilir ve bunlardan kalıtım alınabilir.
Bir metodu geçersiz kılma, üstüne yazma.
Şimdi biraz daha ileri gidelim ve metodun üstüne yazalım. Şimdiden sonra Rabbit stop metodunu kalıtım alır, bu metod this.speed=0’ı Animal sınıfında ayarlamaya yarar.
Eğer Rabbit içerisinde kendi stop