Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Наследование в JavaScript
В JavaScript существует два подхода к наследованию: прототипное наследование (Prototype-based) и классы (синтаксический сахар над прототипами). Оба основаны на одном механизме, но классы предоставляют более знакомый синтаксис для разработчиков, привыкших к языкам с классическим ООП.
Прототипное наследование (Classical approach)
Каждый объект в JavaScript имеет внутреннее свойство [[Prototype]], которое можно явно установить через Object.create() или конструктор с new:
const animal = {
speak() { console.log("Sound"); }
};
const dog = Object.create(animal);
dog.name = "Rex";
dog.speak(); // "Sound" — наследовано от animal
Или через конструктор:
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + " makes a sound");
};
function Dog(name) {
Animal.call(this, name); // вызов родителя
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
const dog = new Dog("Rex");
dog.speak(); // "Rex makes a sound"
Классы (Modern approach)
ES6 классы — это синтаксический сахар над прототипным наследованием. Они делают код понятнее и безопаснее:
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + " makes a sound");
}
}
class Dog extends Animal {
speak() {
super.speak(); // вызов метода родителя
console.log(this.name + " barks!");
}
}
const dog = new Dog("Rex");
dog.speak();
// "Rex makes a sound"
// "Rex barks!"
Цепочка прототипов (Prototype chain)
Когда вы обращаетесь к методу объекта, JavaScript ищет его в порядке:
- На самом объекте
- На его
[[Prototype]] - На прототипе прототипа (и так вверх)
- Пока не найдёт или не достигнет
null(конец цепи)
dog.name; // найдено на dog
dog.speak(); // найдено на Animal.prototype
dog.toString(); // найдено на Object.prototype
Ключевые отличия
- Прототипное: переиспользуешь объекты как прототипы, гибко, но сложнее
- Классы: знакомый синтаксис, читаемость, лучше для больших проектов
- Оба работают одинаково под капотом — классы компилируются в прототипное наследование
Современный стандарт рекомендует использовать классы, так как они безопаснее и понятнее.
Похожие вопросы
- Что не нужно писать в render в React?
- Проходишь ли какие-либо курсы
- Для каких целей используешь React Context
- Как попадают стили из одного компонента в другой без Scope?
- Как понять когда в коде должно быть замыкание?
- Является ли map мутирующим методом массива?
- Всплывает ли событие focus
- Как верстку сделать кроссбраузерной?
- Зачем нужно размонтирование в React?
- Как при написании this понимаешь что будет нужный объект?
- Как можно работать с WebSocket в React?
- Нужно ли делать отдельный catch для каждого then в Promise?
- Какие знаешь методы передачи контекста функции?
- Как Event Loop работает с рендерингом?
- Как узнать при выполнении нескольких Promise какие упали и какие выполнились?
- Почему хуки не стоит вызывать с условием?
- Какие выделишь технологические особенности React?
- Какие знаешь аргументы в useEffect?
- Будет ли работать CORS, если отправить запрос через Postman?
- Для покрытия проекта выберешь End-to-End или Unit тесты