instance.replaceMe(40).revealVar();
оповещения 42
ОК, для этого достаточно return MyClass.staticHelper(this, value);
. Вопрос только ли следующий вызов instance.revealVar()
теперь должен предупредить 2 или 42 - если вы хотите instance
быть изменен на 42 она становится все более сложным:
this = MyClass.staticHelper(value); // this will fail
... потому что this
не является общей переменной, а ключевое слово и evaluates to the value of the ThisBinding of the current execution context, которое is set depending on how the function is entered - вы не можете назначить ему, вы можете установить его только при вызове функции.
Я не хочу назначать все внутренние переменные вручную каждый раз, а скорее заменять весь объект.
К сожалению, вы должны сделать так, без изменения свойств instance
объекта (и закрывающего скрытого переменных) не изменит instance
и revealVar()
пробудет 2.
Есть ли простой способ сделать это?
Да, это может быть сделано программно.Самый простой метод будет call конструктор (снова) на текущий экземпляр, как это происходит при вызове с new
keyword:
MyClass.call(instance, instance.myVar + value);
Тем не менее, вы не можете использовать это как статическая функция, которая создает полностью новый экземпляр. Либо вы ставите его в статическом методе, либо называете это от replaceMe
с помощью this
или просто положите его прямо в replaceMe
.
Если вам нужен статический метод, который в первом возвращающий совершенно новый экземпляр, вы можете использовать это, а также путем копирования новых свойств на старом экземпляре:
….replaceMe = function(val) {
var newInst = MyClass.staticHelper(this, val); // new MyClass(this.myVar+val);
for (var prop in newInst)
if (newInst.hasOwnProperty(prop))
this[prop] = newInst[prop];
return this;
};
Это означает, что перезапись старых атрибутов, и теперь старые затворы могут собираться в мусор, поскольку ничто не относится к ним больше.
Btw, я бы рекомендовал put your methods on the prototype instead of assigning them in the constructor.
Похоже, вы просто хотите вернуть MyClass.staticHelper (this, value); '. Вы не можете заменить 'this', но вы можете вернуть новый похожий объект. –
Это приведет только к возврату нового объекта в цепочку вызовов, но фактически не заменит экземпляр. –
Да, это невозможно. Вы можете создать оболочку для всего класса и сохранить внутреннюю ссылку на фактический экземпляр. –