三重嵌套对象函数js

时间:2016-05-31 15:38:40

标签: javascript function object

我有一个主要由函数/方法组成的对象,就像这样(哪个应该可以工作!):<​​/ p>

function thing1(){
    this.thing2 = function(){
        this.thing3 = function(){
            alert();
        }
    }
}

但是

当我致电thing1.thing2.thing3()时,我会

无法读取属性&#39; thing3&#39;未定义的

完整的伪代码:

function thing1(){
    this.thing2 = function(){
        this.thing3 = function(){
            alert();
        }
    }
}

var foo = new thing1();
foo.thing2.thing3();

2 个答案:

答案 0 :(得分:0)

那些是构造函数:

function thing1(){
    this.thing2 = function(){
        this.thing3 = function(){
            alert();
        }
    }
}

(new (new thing1()).thing2()).thing3()

如果您想拨打thing1.thing2.thing3(),请将其格式化为:

function thing1(){
    this.thing2 = {
        thing3: function(){
            alert();
        }
    }
}

var foo = new thing1();

foo.thing2.thing3()

答案 1 :(得分:0)

thing2不会返回导致返回undefined的任何内容。

如果要编写链式函数,则需要返回this

function thing1() {
    this.thing2 = function() {
        this.thing3 = function() {
            alert();
        }
        return this; // chained
    }
}

一般来说,如果您打算将它用作构造函数,最好将方法分配给函数原型。您仍然可以在原型上链接函数。

function thing1() {
}

thing1.prototype.thing2 = function() {
  return this; // chained
};

thing1.prototype.thing3 = function() {
  alert('thing3');
  return this; // you can make this one chained as well, if you like
};

var t = new thing1();
t.thing2().thing3().thing2().thing3();

如果您只想创建基本链而不需要括号,则可以创建单独的getter function

function thing1() {
}

Object.defineProperty(thing1.prototype, 'thing2', {
  get: function() {
    return this;
  }
});

thing1.prototype.thing3 = function() {
  alert('thing3');
  return this;
};

var foo = new thing1();
foo.thing2.thing3().thing2.thing3();