Всем привет! Пост будет длинный, пожалуйста, дочитайте до конца и подскажите, буду очень благодарен!
Для начала приведу простой пример, на который буду ссылаться в дальнейшем.
let animal = {
eat: true,
};
let rabbit = {
__proto__: animal,
};
console.log( rabbit.eat ) // true
Тут всё просто и понятно, прототипом для rabbit'а является объект animal поэтому rabbit, не найдя свойство "eat" у себя, возьмёт его от прототипа. Идём дальше.
Известно, что функция-конструктор (далее ф-к) при вызове new Function()/Function()
неявно возвращает объект this, который изначально равен пустому объекту {}.
Также, известно, что ф-к имеет скрытое свойство prototype, значением которого является объект с полем конструктор. Конструктор равен самой ф-к. Таким образом, вызов new Function()/Function() вернет объект, для которого прототипом изначально является ф-к.
Вопрос заключается вот в чём. Имеем следующий код:
function User() {
function sayHi() {
console.log('hello')
}
}
let user = new User() // user = {}
user.sayHi() //sayHi не отрабатывает!
Моя логика следующая.
В user на 8 строчке "падает" пустой объект.
На 9 строке мы пытаемся вызвать метод sayHi().
В самом объекте этого метода нет. НО
Если объект не находит у себя поле/метод он идет искать их по цепочки прототипов (что и приведено в начале поста).
У user'a нет такого метода, за ним он идет в прототип,
коим является ф-к, в которой этот метод есть. Почему же тогда он его не отрабатывает?
Понятно, что написав this.sayHi() {..} все будет работать, метод упадет сразу в объект при выполнении ф-к.
Но почему не работает принцип прототипного наследование?
Заранее спасибо!