у меня есть что-то похожее на это:Как сохранить javascript «этот» контекст внутри одноэлементного шаблона?
var a = (function() {
return {
b: 1,
c: function() {
console.log(this.b);
}
};
})();
Так,
a.c(); // = 1
Но если я
b = 2;
a.c.apply(this); // = 2
Можно ли сохранить контекст "этого" внутри «ас() ", не меняя (слишком много) структуру" a "объекта? У меня нет контроля над вызовом функции, поэтому мне нужно обходное решение, чтобы справиться с этим внутри самого объекта.
UPDATE:
Чтобы быть более точным, это структура моих файлов:
Структура 1 (Singleton как шаблон):
var a = (function() {
var _instance;
function init() {
return {
b: 1,
c: function() {
console.log(this.b);
}
};
}
return {
getInstance: function() {
if (_instance === undefined) {
_instance = init();
}
return _instance;
}
}
})();
Структура 2:
var b = {
c: 1,
d: function() {
console.log(this.c);
}
};
РЕШЕНИЕ:
Я реализовал решение, основанное на ответе Маху, и разделил оператор return внутри init(), поэтому он остается безопасным для контекста объекта (и экземпляра) в любой ситуации.
Для одноплодной схеме:
var a = (function() {
var _instance,
self;
function init() {
return self = {
b: 1,
c: function() {
console.log(self.b);
}
};
}
return {
getInstance: function() {
if (_instance === undefined) {
_instance = init();
}
return _instance;
}
};
})();
Для литерала объекта:
var b = (function() {
var self;
return self = {
c: 1,
d: function() {
console.log(self.c);
}
};
})();
Так
a.getInstance().c(); // 1
a.getInstance().c.apply(this); // 1
setTimeout(a.getInstance().c, 1); // 1
$.ajax({ complete: a.getInstance().c }); // 1
The * аналогичный * код дает ошибку: 'Uncaught SyntaxError: Неожиданный маркер:'. –
'a.c()' не возвращает функцию, поэтому вы не можете вызвать метод 'apply'. Вы имели в виду 'a.c.apply (this)'? – Barmar
@SpencerWieczorek это просто причина, по которой 'return' находится в другой строке –