Как получить контекст объекта в котором находится объект? JS

324
23 января 2018, 13:50

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

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()

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

Answer 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();

Answer 2

Единственный способ в литерале объекта обратиться к нему же с помощью 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()

READ ALSO
Отображение img и работа src в js

Отображение img и работа src в js

На клиенте в браузере выводятся изображения фотографий небольших размеров, например, 20 штук в формате :

174
Как обратится к объекту через индекс как в массиве?

Как обратится к объекту через индекс как в массиве?

Есть объектКак обратится через индекс как в массиве? Могу и понимаю как делать

186
Не работает transition во Vue компоненте

Не работает transition во Vue компоненте

Имеется следующий код во Vue-компоненте:

454
Помощь с setInterval и setTimeout. “Карусель”

Помощь с setInterval и setTimeout. “Карусель”

При загрузке страницы, интервал стартует как надоЯ поставил кнопку для паузы интервала, но работает не так как надо

229