2009-09-08 138 views
2

我试图做这样的事情的对象上保持状态:在JavaScript构造参考实例变量

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

我想设置的实例变量foo的为“栏”当我打电话的改变状态的方法。

例如:

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搜索中删除了“this”。

基本上,在JavaScript中,this总是指调用对象,而不是上下文对象。因为这里我们从全局范围调用o.changeState(),所以this指向窗口。

实际上,在这种情况下,实际上并不需要闭包的内部函数 - changeState函数本身足以关闭词法范围。

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