Как мне получить доступ к объекту внутри себя, внутри другого объекта? - PullRequest
0 голосов
/ 12 ноября 2018

Я знаю, что использование ключевого слова this в объекте ссылается на объект, но как насчет вложенных объектов?

var mainObj = {
  childObj: {
    addProperty: function() {
      this.message = "HELLO";
    }
  }
};
mainObj.childObj.addProperty();

Как мне получить доступ к свойству this.message как внутри, так и снаружи объекта childObj?

1 Ответ

0 голосов
/ 12 ноября 2018

Быстрый ответ: в другом методе mainObj вы можете использовать this.childObj.message, и вы можете использовать mainObj.childObj.message извне:

var mainObj = {
  childObj: {
    addProperty: function() {
      this.message = "HELLO";
    }
  },
  msg() {
    return this.childObj.message;
  },
};
mainObj.childObj.addProperty();
console.log(mainObj.msg()); // HELLO
console.log(mainObj.childObj.message); // HELLO

Некоторые context on this:

Из документации MDN :

Функция ключевого слова this ведет себя немного иначе в JavaScript по сравнению с другими языками. Он также имеет некоторые различия между строгим режимом и нестрогим режимом.

В большинстве случаев значение этого параметра определяется тем, как вызывается функция. Он не может быть установлен присваиванием во время выполнения, и он может отличаться при каждом вызове функции. ES5 представил метод bind для установки значения функции this независимо от того, как она вызывается, а ES2015 ввел функции стрелок, которые не предоставляют свои привязки this (он сохраняет значение this в рамках лексического контекста).

Обычно, в зависимости от контекста, this может означать разные вещи:

Глобальный контекст

За пределами любой функции this относится к глобальному объекту. В браузере это означает this === window.

Контекст функции

В функции значение this зависит от того, как вы вызываете функцию, и используете ли вы режим strict или нет. , в основном это может указывать на глобальный объект или наследовать контекст выполнения.

При вызове функции как метода объекта это будет установлено для объекта, которому принадлежит метод в вызове :

//'use strict';
window.message = 'wat';
const obj1 = { message: 'hi 1', hi() { return this.message; }};
const obj2 = { message: 'hi 2', hi() { return this.message; }};

// Normal invocation
console.log(obj1.hi())
console.log(obj2.hi())

// As functions:
const obj1Hi = obj1.hi;
console.log(obj1Hi()); // returns wat on non-strict mode!
// enable use strict to see the error thrown by this defaulting to undefined/


// Swap the functions around
obj1.hi = obj2.hi;
obj2.hi = obj1Hi;

console.log(obj1.hi()) // still uses message from obj1
console.log(obj2.hi()) // still uses message from obj2

// You can even do some `bind` magic to force the context on a function:

console.log(obj1Hi.bind(obj1)()); // hi 1
console.log(obj1Hi.bind(obj2)()); // hi 2
...