У меня есть следующий код для целей JS-обучения:JavaScript - как сохранить состояние «это» правильно
function A() {
var self = this;
this.test1 = function() {
console.log("A_test1");
B().test2();
return self;
}
this.problem = function() {
console.log("I'm never called");
}
return self;
}
function B() {
var self = this;
this.test2 = function() {
console.log("B_test2");
return self;
}
this.problem = function() {
console.log("I'm a headach and overwrite others in my free time");
}
return self;
}
/*
* This is our "main" function like in C
*/
$(function(){
A().test1().problem();
});
Я отлаженный код с Firebug. Давайте рассмотрим нижеприведенную строку из «основной» функции: A(). Test1(). Problem();
1) A()
«Ключевое слово„это“не является функцией (класс) объекта. Это всегда„окно“объект, который распространяется построчно в время выполнения с помощью свойств/методов текущего объекта (в нашем случае: объект функции A). Итак, когда мы доходим до конца A() (т.е. «return self»), содержимое этого «этого» объекта следующее:
- все свойства/методы "окна" объект
- test1() и Проблема.() Методы A
2) А() test1() метод
test1() имеет линию "B() test2();". Так она называет в следующем B()
2,1) B()
Когда мы достигаем конца B() (т.е. Самовозврат), «это» содержание объекта заключается в следующем:
- всех свойства/методы «окно» объект
- test1() метод
[задача() метод А теряется, потому что она перезаписывается задачами() из B] - test2() и проблема() методы B
2.2) B(). test2()
Это работает, как ожидалось, и это нормально. Итак, мы финишируем с помощью A(). Test1().
3) A(). Test1(). Problem();
И это вызывает метод проблемы B(), хотя я хочу вызвать проблему A() здесь.
Итак, каков правильный способ сохранения онлайн-состояния «этого» объекта? (Понятно, что «я» вообще не имеет никакого эффекта, поскольку это ссылка (например, на C) на «этот» объект.)
Я мог бы клонировать состояние этого «объекта» в начале каждый конструктор, то есть:
вместо
var self = this;
как об этом
var self = this.clone();
Но я не уверен, если это хорошая идея.Причина клонирования состояния «этого» для каждого вновь созданного объекта могла бы убить память в большой структуре, не так ли?
Я уверен, что я не первый человек, столкнувшийся с этой проблемой. Мой поисковик Google дал мне немного. Так снова, каков правильный способ спасти «это»? Как я могу позволить проблеме A() вызывать в этом примере вместо задачи B()?
необходимо использовать конструктор 'A', то есть' var a = new A() ', тогда' this' укажет на новый объект вместо 'window' –
@ArunPJohny: Отправьте это как ответ. – icktoofay
@icktoofay done –