“这”不是指当前的对象

时间:2012-09-10 17:30:30

标签: javascript this

我对JS中的OOP有点新意。我想知道为什么在创建子对象时,这会停止引用第二级子对象之后的主对象。

function Clase()
{
    this.__construct = function()
    {
    this.paginator();            
    alert('__construct finished');
    };                

    this.paginator = function()
    {

        this.paginator.title = function()
        {
            this.paginator.title.set_offsets  = function()
            {
                alert('paginator.title.set_offsets executed!');

            };
        };

        this.paginator.title(); //instantiating

        alert('subobject paginator created');            
     };

    this.__construct();
}

var instancia = new Clase();

instancia.paginator.title.set_offsets();

http://jsfiddle.net/WYWwE/

错误是:this.paginator未定义。

现在,如果我使用闭包,它的效果非常好:

function Clase()
{
    self = this;

    this.__construct = function()
    {
        this.paginator();            
        alert('__construct finished');
    };                

    this.paginator = function()
    {

        self.paginator.title = function()
        {
            self.paginator.title.set_offsets  = function()
            {
                alert('instancia.paginator.title.set_offsets() executed');

            };
     };
     self.paginator.title();

     alert('this.paginator created');
};

this.__construct();
}

var instancia = new Clase();

instancia.paginator.title.set_offsets();

http://jsfiddle.net/esjHu/

所以,AFAIK经过一段时间后,“这个”停止引用“Clase”这个类并引用别的东西。如果是这样,以这种方式使用闭包是一个好习惯吗?

用self = this开始上课也是正确的;从那时起只使用“自我”?例如:http://jsfiddle.net/byGRX/

2 个答案:

答案 0 :(得分:3)

当您嵌套this时,您将失去对“原始”function的引用。要解决此问题,请执行以下操作:

function Clase() {
    var that = this;


    this.paginator = {

        title: {

            set_offsets: function() {
                alert('paginator.title.set_offsets executed!');

            }
        }
    };
};

var foo = new Clase();

foo.paginator.title.set_offsets();​

http://jsfiddle.net/vd5YK/

答案 1 :(得分:0)

你不会失去对this对象的引用,这是发生的事情:

例如:

function Class() {

  this.func1 = function () {

    this.func1.func2 = function () {
      alert('Works!');
    };

  };

  this.func1.func2();
}

x = new Class();

现在,您收到错误消息称func2不存在的原因是因为func2的函数对象在您调用func1之前未构建:

function Class() {

  this.func1 = function () {

    this.func1.func2 = function () {
      alert('Works!');
    };

  };

  this.func1();
  this.func1.func2();
}

x = new Class();

现在它有效。

修改

那么,为什么这不起作用:

function Class() {

    this.func1 = function() {

        this.func1.func2 = function() {

            this.func1.func2.func3 = function() {
                alert('works!');
            };

            this.func1.func2.property = 5;
        };

    };

    this.func1();
    this.func1.func2();
}

x = new Class();

x.func1.func2.func3();

基本上,您要做的是将一个名为property的属性和一个名为func3的方法添加到func2的函数对象中,但问题是func2在调用func1之前不构造。这和做的一样:

function Class() {

    this.func1 = function() {

        this.func1.func2 = function() {};

    };

    this.func1.func2.func3 = function() {
        alert('works!');
    };
    this.func1.func2.property = 5;

    this.func1();
    this.func1.func2();
}

x = new Class();

x.func1.func2.func3();

如果你想让它工作,你需要先调用func2来构建func1的函数对象:

function Class() {

    this.func1 = function() {

        this.func1.func2 = function() {};

    };

    this.func1();

    this.func1.func2.func3 = function() {
        alert('works!');
    };
    this.func1.func2.property = 5;

    // this.func1.func2();

}

x = new Class();

x.func1.func2.func3();
alert(x.func1.func2.property);