Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.09.2020, 13:42
Новичок на форуме
Отправить личное сообщение для igogo333 Посмотреть профиль Найти все сообщения от igogo333
 
Регистрация: 21.09.2019
Сообщений: 9

Вопрос по классам и слову this
Здравствуйте!
Есть такой класс:
class C1 {
     f1() { console.log("f1"); }
     f2() { console.log("f2"); this.f1(); }
     f3() { console.log("f3"); c1.f1(); }
}
let c1 = new C1();


Вопрос: надо ли использовать всегда this.f1(); или можно всегда использовать c1.f1() ?

Дело в том, что иногда функция f2 вызывается в таком контексте, что this ссылается просто в никуда. А вот f3 вызывается в любом контексте нормально.
Ответить с цитированием
  #2 (permalink)  
Старый 15.09.2020, 16:51
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,742

Сообщение от igogo333
Вопрос: надо ли использовать всегда this.f1(); или можно всегда использовать c1.f1() ?
Функции (методы класса) вызываются с членом класса.
После c1 = new C1() разумеется надо вызывать c1.f1()
this указывает на текущий член класса внутри методов этого класса.
Если Вы вызвали c1.f2(), то внутри f2 this будет ссылаться на c1.
Внутри метода класса обратиться к текущему члену класса (с которым был вызван метод можно только через this.

Сообщение от igogo333
Дело в том, что иногда функция f2 вызывается в таком контексте, что this ссылается просто в никуда
Это как? Приведите пример. this может ссылаться только на член класса с которым вызван метод f2
Сообщение от igogo333
А вот f3 вызывается в любом контексте нормально.
Это совсем не нормально
А если вы строку 6 переделаете
let c2 = new C1();
Что будет обозначать c1 в методе f3?
Ответить с цитированием
  #3 (permalink)  
Старый 15.09.2020, 18:56
Новичок на форуме
Отправить личное сообщение для igogo333 Посмотреть профиль Найти все сообщения от igogo333
 
Регистрация: 21.09.2019
Сообщений: 9

Спасибо за ответ!

Цитата:
Это как? Приведите пример. this может ссылаться только на член класса с которым вызван метод f2
например, вот:

class C1 {

 f1() { console.log(this); console.log("f1"); }

 authInfo(response) {
    if (response.session) {
	if (response.session.user) {
            var user = response.session.user;
        }
    }
    this.f1(); // не работает
    c1.f1(); // работает
 }
}
let c1 = new C1();
VK.Auth.getLoginStatus(c1.authInfo);


здесь или контекст this не передается, если вызывать VK.Auth.getLoginStatus(c1.authInfo);
или аргумент response не передается, если вызывать VK.Auth.getLoginStatus(c1.authInfo());


Цитата:
Это совсем не нормально
А если вы строку 6 переделаете
let c2 = new C1();
Что будет обозначать c1 в методе f3?
Да, это проблема. Но все-таки вопрос: проблема только в потенциальной угрозе переименования?
А если предположить, что имя класса всегда будет одним и тем же, то других проблем нет с тем чтобы использовать всегда имя класса вместо this?
Или там еще какие-то могут вылезти проблемы?

Последний раз редактировалось igogo333, 15.09.2020 в 18:59.
Ответить с цитированием
  #4 (permalink)  
Старый 15.09.2020, 19:44
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,742

А зачем authInfo делать методом какого то класса?
Методы класса нужны, что бы как то работать с объектами членами класса.
Я так понимаю, что в VK.Auth.getLoginStatus нужно передать какую то функцию, но эта функция никак не связана ни с каким объектом
Если так уж нужно, что бы она как-то имела доступ с какому то объекту, да еще через this то можно так

class C1 {
 
 f1() { console.log(this); console.log("f1"); }
 

}

 authInfo(response) {
    if (response.session) {
    if (response.session.user) {
            var user = response.session.user;
        }
    }
    this.f1(); // работает
    // c1.f1(); // - не нужно
 }

let c1 = new C1();
VK.Auth.getLoginStatus(authInfo.bind(c1));

let c2 = new C1();
VK.Auth.getLoginStatus(authInfo.bind(c2));


Если очень хочется, привязать ее к классу (ну, кажется, что код яснее, понятнее, красивее)
то можно так

class C1 {
 
 f1() { console.log(this); console.log("f1"); }
 
  static authInfo(response) {
    if (response.session) {
    if (response.session.user) {
            var user = response.session.user;
        }
    }
    this.f1(); // будет работать
    // c1.f1(); // не нужно
 }
}
let c1 = new C1();
VK.Auth.getLoginStatus(C1.authInfo.bind(c1));


без bind тут трудно обойтись, т.к. внутри VK.Auth.getLoginStatus переданная функция вызывается без привязки к какому либо объекту.

Последний раз редактировалось voraa, 15.09.2020 в 19:55.
Ответить с цитированием
  #5 (permalink)  
Старый 15.09.2020, 21:07
Новичок на форуме
Отправить личное сообщение для igogo333 Посмотреть профиль Найти все сообщения от igogo333
 
Регистрация: 21.09.2019
Сообщений: 9

Круто. Спасибо!

А еще иногда this не определяется в функциях обратного вызова.

И все-таки вопрос:
Можно ли внутри класса C1 всегда использовать имя класса c1 вместо this?
Проблема только в потенциальной угрозе переименования c2 = new C1() ?
Или там еще какие-то могут вылезти проблемы?
Ответить с цитированием
  #6 (permalink)  
Старый 15.09.2020, 21:24
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,742

Сообщение от igogo333
А еще иногда this не определяется в функциях обратного вызова.
Это зависит от того, откуда делается обратный вызов. Везде могут быть разные соглашения. Обратный вызов - это просто вызов функции. Но в некоторых случаях АПИ дополнительно передает какой-то объект через this. this в js никак изначально не связан с классами.
Сообщение от igogo333
Можно ли внутри класса C1 всегда использовать имя класса c1 вместо this?
js хорош тем, что в нем много чего можно. Вопрос - зачем.
Если вы используете классы, то это как бы подразумевает, что вы используете концепцию объектно-ориентированного программирования.
Ну так и надо ей следовать. Но совсем не обязательно напяливать классы на то, на что они плохо напяливаются. Особенно там, где приходится использовать различные АПИ, которые по сути не являются объектно ориентированными. Или хитрить различными bind, apply и проч. Для этого их и придумали в js
Ответить с цитированием
  #7 (permalink)  
Старый 15.09.2020, 21:31
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,742

Сообщение от igogo333
Проблема только в потенциальной угрозе переименования c2 = new C1() ?
А вы предполагаете, что у вас будет только с1?
А зачем тогда класс? Класс чаще всего нужен что бы порождать различные объекты - члены этого класса.
Ответить с цитированием
  #8 (permalink)  
Старый 16.09.2020, 05:16
Новичок на форуме
Отправить личное сообщение для igogo333 Посмотреть профиль Найти все сообщения от igogo333
 
Регистрация: 21.09.2019
Сообщений: 9

Понял. Большое спасибо!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос про возможности JS для рисования и анимации macdack Библиотеки/Тулкиты/Фреймворки 3 15.07.2011 00:13
Я как ответить на вопрос - есть ли жизнь на других планетах? TicTac Оффтопик 5 28.04.2011 04:29
Вопрос авторизации. 0931454574 Серверные языки и технологии 8 12.04.2011 11:09
Вопрос на миллион. Ajax и идентификация по адресной строке. 0931454574 AJAX и COMET 5 31.03.2011 11:54
Вопрос по замыканиям Goodfella Общие вопросы Javascript 20 09.03.2011 01:21