🤔 Как обратиться к методу в цепочке?



Нужно вызвать этот метод через объект. Если метод не найден на самом объекте, интерпретатор JavaScript будет подниматься по цепочке прототипов до тех пор, пока не найдет метод или не достигнет вершины цепочки (обычно это Object.prototype).



Рассмотрим пример с использованием функций-конструкторов и прототипов:

// Создаем конструктор Animal

function Animal(name) {

this.name = name;

}



// Добавляем метод speak к прототипу Animal

Animal.prototype.speak = function() {

console.log(`${this.name} издает звук.`);

};



// Создаем конструктор Dog, который наследует от Animal

function Dog(name, breed) {

Animal.call(this, name); // Вызов конструктора Animal

this.breed = breed;

}



// Наследуем прототип Animal

Dog.prototype = Object.create(Animal.prototype);

Dog.prototype.constructor = Dog;



// Добавляем метод bark к прототипу Dog

Dog.prototype.bark = function() {

console.log(`${this.name} лает.`);

};



// Создаем экземпляр Dog

const myDog = new Dog('Рекс', 'Лабрадор');



// Обращение к методам

myDog.speak(); // Рекс издает звук.

myDog.bark(); // Рекс лает.




🚩Пошаговое выполнение



1⃣Создание экземпляра `myDog`:

Когда вы создаете новый экземпляр Dog, функция-конструктор Dog вызывается, и у нового объекта myDog появляются свойства name и breed.



2⃣Наследование прототипа:

Объект myDog наследует методы speak и bark через цепочку прототипов.

myDog.__proto__ указывает на Dog.prototype.

Dog.prototype.__proto__ указывает на Animal.prototype.



3⃣Вызов метода speak:

Когда вы вызываете myDog.speak(), интерпретатор сначала ищет метод speak на объекте myDog. Не найдя его там, он поднимается по цепочке прототипов и находит метод speak в Animal.prototype.



4⃣Вызов метода bark:

Когда вы вызываете myDog.bark(), интерпретатор сначала ищет метод bark на объекте myDog. Не найдя его там, он поднимается по цепочке прототипов и находит метод bark в Dog.prototype.



🚩Проверка наличия метода



Если вы хотите проверить, где именно находится метод в цепочке прототипов, можно использовать метод hasOwnProperty для проверки собственного свойства объекта и оператор in для проверки наличия свойства в объекте или его прототипах.

console.log(myDog.hasOwnProperty('speak')); // false, так как метод унаследован

console.log('speak' in myDog); // true, так как метод найден в цепочке прототипов



console.log(myDog.hasOwnProperty('bark')); // false, так как метод унаследован

console.log('bark' in myDog); // true, так как метод найден в цепочке прототипов




Чтобы обратиться к методу в цепочке прототипов, достаточно вызвать метод через объект. Если метод не найден на самом объекте, JavaScript будет подниматься по цепочке прототипов до тех пор, пока не найдет метод или не достигнет вершины цепочки (обычно это Object.prototype).



Ставь 👍 и забирай 📚 Базу знаний