我有一个主要由函数/方法组成的对象,就像这样(哪个应该可以工作!):</ 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();
答案 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();