我在编写的一大堆代码中遇到了一些麻烦,我已将其归结为:
var Thing = function(argument){
this.property = argument;
this.obj = {
func: function(){
return this;
}
};
this.func = function(){
return this;
};
};
我需要访问this.property
内的obj.func()
。但是,this
的值并非我所期望的那样:
> var thing = new Thing("value")
> thing.func()
Thing {property: "value", obj: Object, func: function}
> thing.obj.func()
Object {func: function}
当我实例化一个名为“thing”的实例并调用thing.func()
时,this
会保留当前Thing
的实例。但是,当我致电thing.obj.func()
时,它会保留thing.obj
的值。这是怎么回事?如何访问该值?
答案 0 :(得分:4)
在构造函数中声明一个局部变量,并为其赋值this
:
var Thing = function(argument){
var theThing = this;
然后,您可以使用“theThing”来引用这些函数中的构造对象。
在现有代码中,当您致电thing.obj.func()
时,该函数中this
的值确实为this.obj
。这是因为this
的值是根据函数调用的情况确定的。在这种情况下,通过在“obj”对象上遍历其属性名称来获得对函数(“func”)的引用。因此,“obj”对象是this
引用的对象。
答案 1 :(得分:4)
var thing = new Thing('value')
thing.obj.func() // this inside func will be the object before .func, which is thing.obj
一种解决方案是将函数绑定到您的对象:
var Thing = function(argument){
this.property = argument;
this.obj = {
func: function(){
return this;
}.bind(this); // bind it to the current object
};
this.func = function(){
return this;
};
};
或者,您可以使用具有this
的私有副本的闭包:
var Thing = function(argument){
var that = this;
this.property = argument;
this.obj = {
func: function(){
return that;
}
};
this.func = function(){
return this;
};
};
答案 2 :(得分:1)
这就是this
上下文在Javascript中的工作方式。您需要存储对Thing的中间引用:
var Thing = function(argument){
var self = this;
this.property = argument;
this.obj = {
func: function(){
return self;
}
};
this.func = function(){
return self;
};
};
答案 3 :(得分:0)
this
是指默认拥有该函数的对象,在本例中为obj
。这是一个解决方法:
thing.obj.func.call(thing);