Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.07.2019, 17:51
Интересующийся
Отправить личное сообщение для Кирилл Margheriti Посмотреть профиль Найти все сообщения от Кирилл Margheriti
 
Регистрация: 02.04.2019
Сообщений: 19

Ссылочный тип this
https://learn.javascript.ru/object-m...ssylochnyy-tip

Подскажите чтобы данный пример (первый в разделе Ссылочный тип) сработал нужно
(user.name == "Вася" ? user.hi : user.bye)();
изменить в
user.name == "Вася" ? user.hi() : user.bye();
чтобы всё заработало, правильно ?
Ответить с цитированием
  #2 (permalink)  
Старый 12.07.2019, 19:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 26,310

Сообщение от Кирилл Margheriti
правильно ?
а самому проверить? работает, значит правильно.
var user = {
  name: "Вася",
  hi: function() { alert(this.name); },
  bye: function() { alert("Пока"); }
};

user.hi(); // Вася (простой вызов работает)
// а теперь вызовем user.hi или user.bye в зависимости от имени
user.name == "Вася" ? user.hi() : user.bye();
user[(user.name == "Вася" ? "hi" : "bye")]();//ещё вариант
Ответить с цитированием
  #3 (permalink)  
Старый 13.07.2019, 09:37
Интересующийся
Отправить личное сообщение для Кирилл Margheriti Посмотреть профиль Найти все сообщения от Кирилл Margheriti
 
Регистрация: 02.04.2019
Сообщений: 19

Я хотел не могу понять причину по которой первая строка не работает, а вторая работает. Я знаю что там есть объяснение но мне не совсем понятно. Заранее спасибо
Ответить с цитированием
  #4 (permalink)  
Старый 13.07.2019, 10:59
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,601

Кирилл Margheriti,
причина в том что вызов методов обязательно со скобками
хотите чтобы работало без скобок? сделайте геттором

var user = {
  name: "Вася",
  get hi(){ alert(this.name); },
  get bye(){ alert("Пока"); }
};

user.name == "Вася" ? user.hi : user.bye;
Ответить с цитированием
  #5 (permalink)  
Старый 13.07.2019, 12:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 26,310

j0hnik,
вопрос был про this!
Кирилл Margheriti,
(user.name == "Вася" ? user.hi : user.bye)();
потому что эта строка "достаёт" функции из обьекта, так
(user.name == "Вася" ? function() { alert(this.name); } : function() { alert("Пока"); })();

и this тут уже скорее будет window, а user.
на форуме есть несколько тем про this, надо искать, там более профессионально изложено.
Ответить с цитированием
  #6 (permalink)  
Старый 14.07.2019, 08:52
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 684

Сообщение от Кирилл Margheriti
Я хотел не могу понять причину по которой первая строка не работает, а вторая работает.
Как написано в учебнике, выражение user.hi или user['hi'] возвращает не функцию, а связку функция+контекст.
И всё зависит от того, что с этим результатом делается на следующем шаге.
Если делается вызов функции, то контекст используется по назначению, попадает в this. Во второй строке как раз этот случай.
А если любое другое действие, то контекст отлетает, остаётся только функция. Например, у тебя в первой строке действие над результатом user.hi - передача его в операцию ?:
Ответить с цитированием
  #7 (permalink)  
Старый 14.07.2019, 10:22
Аспирант
Отправить личное сообщение для Русский Посмотреть профиль Найти все сообщения от Русский
 
Регистрация: 29.05.2019
Сообщений: 42

Если ещё проще:

В коде
(user.name == "Вася" ? user.hi : user.bye)()

ты получаешь по условию одну из функций (hi либо bye), которую и вызываешь впоследствии: она не знает никакого this, относящегося к объекту user, она здесь сама по себе, как бы вырвана из объекта.

А в
user.hi();

ты дёргаешь именно метод объекта user.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JS.next(стандарты, фичи, движки) Safort Оффтопик 360 31.12.2018 04:21
Chrome не показывает тип файла .zip Sigizmund2012 Opera, Safari и др. 2 15.10.2015 11:32
Массив как ссылочный тип Gerald Общие вопросы Javascript 2 20.12.2013 10:07
ecmascript и тип Reference js_noob Общие вопросы Javascript 1 28.02.2010 15:35
тип поля объекта Anatoliy Общие вопросы Javascript 5 23.12.2008 16:17