Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Откуда вызвана функция 
:(
    Опции темы
Aver78
Дата 21.1.2020, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



Есть json объекты такого типа:

a = {
   func1() {
     alert('Как тут получить имя объекта вызвавшего функцию, в данном случае,  - b ?')
     }
}

b = {
   func2() {
       a.func1();
     }
}

P.S. Понятно дело не передавая имя объекта в параметрах функции.


Это сообщение отредактировал(а) Aver78 - 21.1.2020, 20:09
PM MAIL   Вверх
_zorn_
Дата 22.1.2020, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1018
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



Никак. Адекватными методами. 
А из неадыкватных можно попробовать бросить исключение и прогуляться по стектрейсу. Но хз возможно ли это в js

И это не json объекты. json объект это строка типа {"bla":"blabla"} которую можно превратить в обычный объект используемого ЯП.

PS: JavaScript Object NOTATION
PPS. Да и "json объект" звучит как "АвтоВАЗ" - "Автомобильный Волжский Автомобильный Завод"

Это сообщение отредактировал(а) _zorn_ - 22.1.2020, 16:44
PM MAIL   Вверх
_zorn_
Дата 22.1.2020, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1018
Регистрация: 21.8.2007

Репутация: 1
Всего: 12



Хотя можно "имя" не передавать, а замутить `bind` или `call`
Тут уж сам решай 
https://developer.mozilla.org/ru/docs/Web/J...s/Function/bind
https://developer.mozilla.org/ru/docs/Web/J...s/Function/call

Что то типа того
Код

a = {
   func1() {
      alert('Caller name is ' + this.name)
   }
}

b = {
    name: 'BBBB',
    func2() {
        a.func1.call(this);
    }
}


Только сразу скажу, такой код начнет вонять через неделю  smile 


Это сообщение отредактировал(а) _zorn_ - 22.1.2020, 17:10
PM MAIL   Вверх
Aver78
Дата 22.1.2020, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



Цитата

Хотя можно "имя" не передавать, а замутить `bind` или `call`


Да хрен редьки не слаще. Я как раз хочу избежать повторения в вызове функции одного и того-же много раз. А тут получаются то-же самое извращение, только с подвывертом.

Добавлено через 14 минут и 24 секунды
Цитата

Да и "json объект" звучит как

Как то ни разу не озаботился тем что бы расшифровать эту аббревиатура .

Как пройтись по стеку я не понял. Я вообще, мягко говоря, не фанат js, и знания соответствующие.
PM MAIL   Вверх
Aver78
Дата 25.3.2020, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



Так  и не сумел найти ответа.  Может быть вопрос решаем через автоподстановку параметра, хотя бы. Но я и это не могу придумать как сделать.

Код

a = {
   func1(param1) {
     alert(param1)
     }
}

b = {
   name: 'Я - b',
   func2() {
       a.func1(this.name);
     }
}
b.func2();



Для вызова  a.func1 во всех объектах будет использована одна и та-же конструкция для задания параметра param1 - this.name.

Как бы его прописать в функции изначально ? 
Такой вариант соответственно неверный, но возможно есть правильный ? 
Код

a = {
   func1(param1 = this.name) {
     alert(param1)
     }
}





PM MAIL   Вверх
od0201
Дата 7.5.2020, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 16.1.2009

Репутация: нет
Всего: 1



Не совсем понятно, зачем Вам имя объекта.
Если Вы имели ввиду сам объект, который вызвал функцию, то так
Код

  const a = {
    func1:function () { console.log(`объект, вызвавший функцию `, this) }
  }
  const b = {
    func2:a.func1
  }
//  a.func1()
  b.func2()


Код

обьект, вызвавший функцию  {func2: ƒ}

Если в объекте b задать поле name, то в func1 сможете получить это поле => this.name
Если Вы хотите выводить в Alert, то туда объект преобразуется в строку "[object Object]", а вот с this.name в Alert у Вас проблем не будет
Код

  const a = {
    func1:function () { alert(`имя обьект, вызвавшего функцию: ${this.name}`) }
  }
  const b = {
    func2:a.func1,
    name:'poipoi'
  }
  b.func2()


PM MAIL   Вверх
Aver78
Дата 8.5.2020, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 21.4.2007

Репутация: нет
Всего: нет



При  таком определении 

Код

  const a = {
    func1:function () { console.log(`объект, вызвавший функцию `, this) }
  }


Да, this приходит.

А при таком 

Код

const a = {
   func1() { console.log(`объект, вызвавший функцию `, this) }
}


Нет. А мне нужно передавать в функцию параметры, что непонятно как сделать при первом варианте определения.


Неправильно я отписался. func2 - это же не функция, а по сути, просто алиас для вызова Func1. А должна быть функция. И в тот момент когда она превращается в функцию - 

func1:function () {a.func1()}

, то this  в ней переопределяется на объект b. и откуда ее не вызови this будет один и тот же.

Это сообщение отредактировал(а) Aver78 - 8.5.2020, 19:57
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1615 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.