2009-09-08 3 views
2

Я пытаюсь сохранить состояние на объекте, делая что-то вроде этого:Reference Переменные экземпляра в Javascript Конструктора

obj = function() { 
    this.foo = undefined; 
    this.changeState = function() { 
     (function() { this.foo = "bar" })(); // This is contrived, but same idea. 
    }; 
}; 

Я хочу, чтобы установить переменную Foo экземпляра в «бар», когда я вызываю метод changeState ,

Например:

o = new obj(); 
o.changeState(); 
alert(o.foo); // This should say "bar" 

Насколько я могу сказать, что происходит в том, что «это» во внутренней анонимной функции указывает на окно. Я не уверен, что происходит.

Есть ли я на правильном пути? Есть ли лучший подход?

ответ

2

Если вы не укажете этот контекст при вызове функции по умолчанию будет глобальным (окно, которое в браузерах).

Альтернативы: -

obj = function() { 
    this.foo = undefined; 
    this.changeState = function() { 
    (function() { this.foo = "bar" }).call(this); // This is contrived, but same idea. 
    }; 

};

или: -

obj = function() { 
    var self = this; 
    this.foo = undefined; 
    this.changeState = function() { 
    (function() { self.foo = "bar" })(); // This is contrived, but same idea. 
    }; 

};

1

Я понял. Просто необходимо, чтобы сохранить ссылку на текущий контекст и использовать его во внутренней анонимной функции:

obj = function() { 
    this.foo = undefined; 
    var self = this; 
    this.changeState = function() { 
     (function() { self.foo = "bar" })(); 
    }; 
}; 
2
function obj() { 
    this.foo = undefined; 
    this.changeState = function() { this.foo = "bar" }; 
}; 

var o = new obj(); 
o.changeState(); 
alert(o.foo); 

работает для меня. Я не уверен, почему вы хотели бы использовать функцию самозапуска, чтобы назначить ссылку на функцию, а также почему вы используете выражение функции для своего конструктора, а не объявление функции.

3

эта тема много поднимается, но ее трудно засечь, поскольку «это» удаляется из поисков SO.

В принципе, в JavaScript this всегда ссылается на вызывающий объект, а не на объект контекста. Поскольку здесь мы называем o.changeState() из глобальной области, this относится к окну.

На самом деле вам не нужна внутренняя функция закрытия для работы в этом случае - самой функции changeState достаточно, чтобы закрыть лексическую область.

obj = function() 
{ 
    var self = this; 
    this.foo = undefined; 
    this.changeState = function() 
    { 
    self.foo = "bar"; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^