1

Есть код такого плана:

var objParent = {

text: 'Нужное значение',

objChild: {

context: this,
context1: objParent,
text: 'Ненужное значение',

needHere: function(){

  console.log(this.text);
  console.log(this.context.text);
  console.log(this.context1.text);

  // Ниодин из вариантов не дает нужного значения

},

}, }

objParent.objChild.needHere()

Надо получить значение из объекта родителя, находясь в объекте дитя. Как это можно сделать?

Igor
  • 1,211

2 Answers2

1

Можно использовать функцию-конструктор для создания объекта.

function CreateObject() {

var objParent = { text: 'текст',

objChild: {
  needHere: function() {
    console.log(this.context.text);
  }
}

};

/* присваиваем, определяем контекст в необходимое место */ objParent.objChild.context = objParent;

return objParent; }

var objParent = CreateObject(); objParent.objChild.needHere();

  • если убрать функцию - ничего не изменится – Grundy Jan 21 '18 at 14:39
  • @Grundy да, но её можно использовать многократно, для этого её и сделал – Дмитрий Полянин Jan 21 '18 at 14:41
  • @Grundy хочется что бы за конструкцию объекта отвечала одна функция или одно выражение, по моему восприятию красоты кода, если нужно два выражения, это на мой взгляд не так красиво, и к тому же может быть что кто-то создаст скажем первым выражением, а второе забудет, с этой точки зрения делал. – Дмитрий Полянин Jan 21 '18 at 14:45
  • @Grundy то есть, если точек создания объекта в приложении может быть несколько, тогда работает принцип DRY, и не только он. Если объект создаётся только в одном месте, то можно и без функции думаю. – Дмитрий Полянин Jan 21 '18 at 14:46
1

Единственный способ в литерале объекта обратиться к нему же с помощью this - это использовать функцию, либо более удобную запись - getter. (подробнее про определение this в вопросе Потеря контекста вызова)

При этом доступ будет только к самому объекту, но не к родителю (на самом деле тут имеется ввиду контейнер).

Для доступа к родителю необходимо указать ссылку на него напрямую

var objParent = {

text: 'Нужное значение',

objChild: {

get context() {
  return this; // вернет objChild
},
get context1() {
  return objParent; // вернет значение переменной objParent на момент вызова
},
text: 'Ненужное значение',

needHere: function() {

  console.log(this.text);
  console.log(this.context.text);
  console.log(this.context1.text); // нужное значение

},

}, }

objParent.objChild.needHere()

Grundy
  • 81,538