Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.09.2019, 22:10
Новичок на форуме
Отправить личное сообщение для alexsm993 Посмотреть профиль Найти все сообщения от alexsm993
 
Регистрация: 25.09.2019
Сообщений: 3

Особенности прототипного наследования.
Всем привет! Пост будет длинный, пожалуйста, дочитайте до конца и подскажите, буду очень благодарен!
Для начала приведу простой пример, на который буду ссылаться в дальнейшем.
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() {..} все будет работать, метод упадет сразу в объект при выполнении ф-к.
Но почему не работает принцип прототипного наследование?
Заранее спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 29.09.2019, 22:24
Аватар для Aetae
Любитель
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,646

function sayHi() {} - это просто создание обычной функции в текущей области видимости. К методам и прототипу это никакого отношения не имеет вообще.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 29.09.2019, 23:12
Аватар для Rise
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,448

Сообщение от alexsm993
вызов new Function()/Function() вернет объект,
Вызов Func() без new не возвращает объект. Не используй для именования слово Function, даже в объяснениях, это встроенный конструктор, как Object, Array и тд, что может ввести в заблуждение.
Сообщение от alexsm993
вернет объект, для которого прототипом изначально является ф-к.
Вернет объект у которого __proto__ равно Func.prototype. А сама ф-к там находится в свойстве __proto__.constructor, Func.prototype.constructor.
function User() {}
console.log(User == User.prototype.constructor);
console.log(User == new User().constructor); // __proto__.constructor

Сообщение от alexsm993
ф-к имеет скрытое свойство prototype, значением которого является объект с полем конструктор.
Оно никакое не скрытое, его можно перезаписать в любой момент и оно всегда есть у функции независимо от вызова. Раньше давно скрытым считалось __proto__, но сейчас и его можно перезаписать напрямую. Например, можешь посмотреть здесь, как в jquery осуществляется подмена прототипа.

Последний раз редактировалось Rise, 29.09.2019 в 23:33.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постижение прототипного наследования. Подтвердите догадку ) AndryG Общие вопросы Javascript 14 15.06.2016 22:30
Особенности выборки элементов массива в jQuery сфздщсл Общие вопросы Javascript 9 11.07.2015 07:42
Вопрос про особенности работы ОС sexyQuery Оффтопик 5 02.07.2013 10:46
Вертикальный слайдер контента daykkin jQuery 0 17.10.2012 10:30
особенности append/removeChild в firefox Kubik129 Firefox/Mozilla 0 15.04.2011 11:13