Задать вопрос
FriendsKenny
@FriendsKenny

Возможно ли использование в немедленно создаваемых функциях свойств текущего объекта?

Здравствуйте. Появился вопрос, возможно ли при создании свойства у объекта в виде немедленно вызываемой функции использовать другие свойства объекта?

Например:

var obj = {
	msg: (function () {
		var t1 = "TT1";
		
		console.log('MSG');
		return "msg = " + t1;
	}()),
	GetMsg: function () {
		return this.msg;
	}
};

console.log(obj.GetMsg());
console.log(obj.msg);


Результат:

MSG
msg = TT1
msg = TT1


Код отработал как нужно, но значение свойства msg задается как литерал. Пробовал переделать:

var obj = {
	t1: (function () {
		console.log('TT1');
		return "tt1";
	})(),
	msg: (function() {
		console.log('MSG');
		console.log('this.t1 = ' + this.t1);
		
		return "msg = " + this.t1;
	}()),
	GetMsg: function () {
		return this.msg;
	}
};

console.log(obj.GetMsg());
console.log(obj.msg);
console.log(obj.t1);


Результат:

TT1
MSG
this.t1 = undefined
msg = undefined
msg = undefined
tt1


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

Если при создании отдать внешнюю переменную то она ее видит, например:

var t2 = "TT2";

msg: (function(prop) {
	console.log('MSG');
	console.log('prop = ' + prop);
	return "msg = " + prop;
}(t2)),


Но он все равно не принимает свойства текущего объекта.
  • Вопрос задан
  • 2308 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Невозможно. Во первых, самовызывающаяся функция будет исполнена до создания объекта. Во вторых, самовызывающаяся функция будет исполнена в контексте глобального объекта (или undefined в strict mode).
Варианты: либо весить msg уже после создания объекта, либо сделать msg геттером.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
OfferCase Москва
от 400 000 ₽
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
Future Москва
от 50 000 до 70 000 ₽