StudyCode
extends, super, переопределение методов и композиция через миксины.
Каждый объект имеет скрытую ссылку [[Prototype]] на другой объект. Нажми на узел цепочки, чтобы увидеть его свойства.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
return `${this.name} издаёт звук`;
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // ← обязательно! вызов Animal.constructor
this.breed = breed;
}
speak() { // ← переопределяем метод родителя
return `${this.name} лает!`;
}
info() {
return super.speak() + ` (порода: ${this.breed})`;
// ↑ super.speak() — метод родителя
}
}
const rex = new Dog("Рекс", "Хаски");
rex.speak(); // "Рекс лает!"
rex.info(); // "Рекс издаёт звук (порода: Хаски)"
rex instanceof Dog; // true
rex instanceof Animal; // true — цепочка прототипов⚠ В дочернем конструкторе
super()должен быть вызван до первого обращения кthis. Иначе — ошибка ReferenceError.
class Shape {
constructor(color = "black") {
this.color = color;
}
area() { return 0; }
toString() {
return `${this.constructor.name} [цвет: ${this.color}, площадь: ${this.area()}]`;
}
}
class Circle extends Shape {
constructor(radius, color) {
super(color);
this.radius = radius;
}
area() { return Math.PI * this.radius ** 2; }
}
class Rectangle extends Shape {
constructor(w, h, color) {
super(color);
this.w = w;
this.h = h;
}
area() { return this.w * this.h; }
}
const c = new Circle(5, "red");
const r = new Rectangle(4, 6, "blue");
console.log(c.toString()); // Circle [цвет: red, площадь: 78.5...]
console.log(r.toString()); // Rectangle [цвет: blue, площадь: 24]