Особенности прототипного наследования.
Всем привет! Пост будет длинный, пожалуйста, дочитайте до конца и подскажите, буду очень благодарен!
Для начала приведу простой пример, на который буду ссылаться в дальнейшем. 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() {..} все будет работать, метод упадет сразу в объект при выполнении ф-к. Но почему не работает принцип прототипного наследование? Заранее спасибо! |
function sayHi() {} - это просто создание обычной функции в текущей области видимости. К методам и прототипу это никакого отношения не имеет вообще.
|
Часовой пояс GMT +3, время: 06:20. |