0

Добрый день. Никак не могу разобраться с Object и хэшем в Javascirpt.

Есть объект с конструктором такого вида:

const FirstObject = function () {
  // somedata
}

У него есть метод, который для примера просто выводит в лог текст.

FirstObject.prototype.text = function () {
  console.log('some text');
}

Второй объект с конструктором такого вида (создание хэша и заполнение его экземплярами FirstObject):

const SecondObject = function () {
  this.somedata = {};

  this.somedata[0] = new FirstObject();
  this.somedata[1] = new FirstObject();

  // ...
}

У него есть метод перебора хэша и запуска метода объекта FirstObject.

SecondObject.prototype.sendtext = function () {

  Object.keys(this.somedata).map(function (key, index) {
    this.somedata[key].text();
  });

}

Однако, при запуске sendtext, получаю ошибку:

Uncaught TypeError: Cannot read property 'somedata' of undefined

Не понимаю, почему оно считает свойством this 'somedata'. При замене this.somedata на somedata работает:

let somedata = this.somedata
Object.keys(somedata).map( ... )

Однако такой подход глаза режет. Как можно лучше поступить в данном случае?

Veles
  • 167
  • Почитайте про контекст (this) в js. Это типичная ситуация. – YozhEzhi Apr 23 '17 at 07:18
  • для перебора, а не создания нового массива лучше использовать forEach. this можно передать вторым аргументом – Grundy Apr 23 '17 at 07:47

1 Answers1

1

Можно использовать стрелочную функцию у которой нет своего контекста:

const FirstObject = function () {
  // somedata
}

FirstObject.prototype.text = function () { console.log('some text'); }

const SecondObject = function () { this.somedata = [];

this.somedata[0] = new FirstObject(); this.somedata[1] = new FirstObject(); }

SecondObject.prototype.sendtext = function () { Object.keys(this.somedata).map((key, index) => this.somedata[key].text()); }

const x = new SecondObject();

console.log(x.sendtext());

P.S. Также, я заменил this.somedata = {} -> this.somedata = [];

YozhEzhi
  • 759