JavaScript-创建可链接函数的最佳方法是什么?

JavaScript-创建可链接函数的最佳方法是什么?,javascript,return,return-value,Javascript,Return,Return Value,编辑 下面是一个使我的问题更简单的尝试 return this.someFunc(); == return { XXX:this.someFunc() }; 要让XXX实现这一说法,我需要做些什么? 我试图创建一个可以链接的函数。让我写一些假设代码。(任何语法错误都可以忽略,我输入的速度很快,这只是概念代码。)假设所有函数都是本地或全局定义的。:) 此函数允许我链接:test().retest() 但我想做的是退回不止一件物品 test = function(){ this.someFu

编辑
下面是一个使我的问题更简单的尝试

return this.someFunc(); == return { XXX:this.someFunc() };
要让XXX实现这一说法,我需要做些什么?
我试图创建一个可以链接的函数。让我写一些假设代码。(任何语法错误都可以忽略,我输入的速度很快,这只是概念代码。)假设所有函数都是本地或全局定义的。:)

此函数允许我链接:
test().retest()
但我想做的是退回不止一件物品

test = function(){
  this.someFunc = function(){
    this.retest = function(){
      //...code
    }
    //...code
  }
  this.someFunc2 = function(){
    //...code
  }
  return { XXX:this.someFunc(), //What do I put for XXX
           next:this };
}
我想这样做是为了访问test()提供的另一个函数:
test().next.someFunc2()

所以我的问题是:
我仍然希望能够像这样链接:
test().retest()
但是我必须这样做:
test().XXX.retest()

在我的代码中,我可以用什么名字来代替XXX来完成这个任务?这可能吗?我已经尝试了
0
default
。谢谢你的帮助

test = function(){

  var someFunc = function(){
      //...code
  }

  return {
      someFunc:someFunc,
      next:this
  }
}

编辑-为清晰起见,已更新以反映您的问题更新。

您可以创建如下可链接函数:

var test = function(){

    var self = {};
    console.log('test called')

    function someFunc() {
        console.log('someFunc')
        return self;
    }

    function someOtherFunc() {
        console.log('someOtherFunc')
        return self;
    }   

    self.someFunc = someFunc;
    self.someOtherFunc = someOtherFunc;
    return self;

}

test().someFunc().someOtherFunc();
test(); //is ["result1"]
test().retest(); //is ["result1", "result2"]
test().retest().retest(); //is ["result1", "result2", "result3"]
希望这对您有所帮助

您有一个范围问题--您不能在函数中引用\u名称“test”,因为您不知道它是如何调用的

如果以静态方式执行,则可以执行以下操作:

test = function(){

    this.someFunc = function(){ // blaaa
    };

    //...code 
    return { 
        OUTPUT: this.someFunc(), //What do I put for XXX
        test: this
    };
}
将导致:

test().test().test().test().OUTPUT (or something like this)
这样做

test = function(){
  this.someFunc = function(){
    this.retest = function(){
      //...code
    }
    //...code
  }
  this.someFunc2 = function(){
    //...code
  }

  var ret = this.somefunc();
  ret.next = this;

  return ret;
}
编辑:这是一个更好的、功能更强大的版本

test = function(){
  var ret;

  var func = function() {
    console.log("test func");
  }

  ret = function(){
    func();
    return ret;
  }

  ret.test = ret;
  ret.next = ret; // You can define an arbitrary number of members here
  ret.XXX = func(); // Like this, and you can still chain it like your question

  return ret;
}

不确定您的意图是什么,但这将是一个可链接的
测试功能:

function Test(){
  Test.retest = Test.retest || function(){console.log('retested'); return Test;}
  return Test;
}
Test().retest().retest().retest().retest();
/* => result
 retested
 retested
 retested 
 retested
*/
// and
log(Test() === Test); //=> true
使用此代码,您现在可以运行以下代码

test().someFunc().someFunc2().test().someFunc().someFunc().test().test()
以下字符串将在控制台中写入

new Test created
someFunc
someFunc2
new Test created
someFunc
someFunc
new Test created
new Test created

好的,所以我想我理解你的问题,但我不确定(而且这里已经很晚了,所以请相信我)。我想你应该有这样的行为:

var test = function(){

    var self = {};
    console.log('test called')

    function someFunc() {
        console.log('someFunc')
        return self;
    }

    function someOtherFunc() {
        console.log('someOtherFunc')
        return self;
    }   

    self.someFunc = someFunc;
    self.someOtherFunc = someOtherFunc;
    return self;

}

test().someFunc().someOtherFunc();
test(); //is ["result1"]
test().retest(); //is ["result1", "result2"]
test().retest().retest(); //is ["result1", "result2", "result3"]
您可能希望返回对象而不是字符串,但这与一般想法相同。代码非常简单:

var test = (function() {
    var results = ["result1"], 
        i = 1;

    results.retest = (function() {
        results.push("result" + (++i));
        return results;
    });

    return results;
});

test(); //is ["result1"]
test().retest(); //is ["result1", "result2"]
test().retest().retest(); //is ["result1", "result2", "result3"]

不确定这是否是你想要的,但也许这会让你走上正确的道路。

由于你的示例与你发布的方式不一样,我想你的意思是:

test = function(){
  this.someFunc = function(){
    this.retest = function(){
      //...code
    }
    //...code
  }
  this.someFunc2 = function(){
    //...code
  }
  return new this.someFunc();
}
注意返回中的。 现在,为了仍然能够链接您的函数,您必须返回以下内容:

return {retest: new this.someFunc().retest, next:this};
这样做将允许您调用
test()

我希望这能有所帮助。

您的第一个函数不允许您编写
test().retest()
,除非“retest”是一个全局函数。@Pointy-抱歉。我编辑了我的解释。它是在代码中定义的。问题是,
如果您只调用
test()
,它将是对
window
@Pointy的引用-如果不是,我可以用什么默认名称来代替XXX?那么“someFunc”呢?随便你叫什么都行。该值应该是对函数的引用,而不是对函数的调用。(除非“someFunc”本身返回一个函数。)您应该为
var self={}
替换
var self=this
。在这种情况下使用
会污染全局范围。返回在函数内部创建的对象更好。另外,请参阅以获取另一种方法。是的,您是对的,我应该是new test()。someFunc()。使用{}代替此选项更安全。