Нужно вызвать этот метод через объект. Если метод не найден на самом объекте, интерпретатор 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(); // Рекс лает.
Когда вы создаете новый экземпляр
Dog
, функция-конструктор Dog
вызывается, и у нового объекта myDog
появляются свойства name
и breed
.Объект
myDog
наследует методы speak
и bark
через цепочку прототипов.myDog.__proto__
указывает на Dog.prototype
.Dog.prototype.__proto__
указывает на Animal.prototype
. speak:
Когда вы вызываете
myDog.speak()
, интерпретатор сначала ищет метод speak
на объекте myDog
. Не найдя его там, он поднимается по цепочке прототипов и находит метод speak
в Animal.prototype
. 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
).Ставь 👍 и забирай 📚 Базу знаний