Быстрый ответ: в другом методе 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