访问对象内的“this”

时间:2013-11-08 13:40:15

标签: javascript oop

我在编写的一大堆代码中遇到了一些麻烦,我已将其归结为:

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的值。这是怎么回事?如何访问该值?

4 个答案:

答案 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);