Задать вопрос
JimmiJanger
@JimmiJanger
Любопытный активист, под маской ленивого нуба.

Объект, функция и this. Как правильно вызвать функцию?

Здравствуйте. Возможно это довольно глупый вопрос, но подскажите что можно сделать в моём случае.
var example = {
  step_1: {
    get: function () {
      return '12345'
    }
  },
  step_2: {
    get: function () {
      var key = this.step_1.get();
      console.log(key + ' from "step_1"')
    }
  }
};

Если я выполню вызов функции: example.step_2.get()
Мне выдаётся ошибка: Uncaught TypeError: Cannot read property 'get' of undefined

Ну, я понимаю в чём ошибка, потому что this у меня это this-объекта step_2, а не переменной example.
По логике, нужно прокинуть нужный this, в функцию get объекта step_2, но сообразить не могу как это сделать

Пожалууйста подскажите.
  • Вопрос задан
  • 348 просмотров
Подписаться 3 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 6
sergiks
@sergiks Куратор тега JavaScript
♬♬
Может, тут имелись в виду геттеры?
var example = {
  get step_1() {
    return '12345'
  },
  get step_2() {
    var key = this.step_1;
    console.log(key + ' from "step_1"')
  }
};

example.step_2 //  12345 from "step_1"

Впрочем, если настаиваете, можно привязать example как this с помощью bind()
// ...
step_2: {
    get: (function () {
      var key = this.step_1.get();
      console.log(key + ' from "step_1"')
    }).bind(example), // теперь тут this === example
  }

example.step_2.get() // 12345 from "step_1"

Или, чтобы не пачкать руки в машинном масле, можно забиндить потом:
// (исходный код вопроса)

// magic!
Object.keys(example).forEach((key) => {
  if ("get" in example[key])
    example[key].get = example[key].get.bind(example);
});

example.step_2.get(); // 12345 from "step_1"
Ответ написан
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
нужно прокинуть нужный this, в функцию get объекта step_2, но сообразить не могу как это сделать

Ну если в лоб, то так

example.step_2.get.bind(example)();
Ответ написан
hahenty
@hahenty
('•')
var example = ( function( self ) { return self = {
  step_1: {
    get: function() {
      return '12345'
    }
  },
  step_2: {
    get: function() {
      var key = self.step_1.get();
      console.log(key + ' from "step_1"')
    }
  }
} } ) ();

было
var example = ( self => self = {
  step_1: {
    get() {
      return '12345'
    }
  },
  step_2: {
    get() {
      var key = self.step_1.get();
      console.log(key + ' from "step_1"')
    }
  }
} ) ();
Ответ написан
insighter
@insighter
-First time? - Huh? (C#, React, JS)
Если прямо отвечать на вопрос то надо сделать так:

example.step_2.step_1 = example.step_1;
example.step_2.get()
Ответ написан
Alexandroppolus
@Alexandroppolus
кодир
Просто использовать "example" вместо "this". Я ведь правильно понимаю, что другого контекста тут не предусмотрено?

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

Либо степы создавать отдельно, со ссылками друг на друга через DI.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
const example = {
  get step_1 () {
    return '12345';
  },
  get step_2 () {
    var key = this.step_1;
    console.log(key + ' from "step_1"');
  },
};
console.log(example.step_2);
// 12345 from "step_1"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы