在咖啡脚本中嵌套方法

时间:2013-04-17 12:44:50

标签: javascript coffeescript

我目前正在尝试在咖啡脚本中制作需要嵌套方法的东西。我想要这样的东西。

class test
    constructor: (one, two, three) ->
        #do something with one two and three
    @method1: (one, two) ->
         #do something with vars
         @method2: (one, two, three, four) ->
            #do something with vars
            @method3:() ->
                    #do something

我希望能够运行这样的方法。

main = new test(one, two, three)
meth1 = main.method1(four, five)
meth2 = meth1.method2(six, seven, eight, nine)
meth3 = meth2.method3()

我也希望能够返回值,例如。

variable = new test(one, two, three).method1(four, five).something

我不想要的一件事是可以从一个地方访问所有不同的方法,例如,我不希望这种情况发生:

new test(one, two, three).method3()

我不知道这是否会有所帮助,但我想要执行的操作只与页面上的HTML进行交互。

我一直在尝试各种方法,但到目前为止还没有完全有效。

3 个答案:

答案 0 :(得分:1)

这不称为嵌套,而是chaining。要启用它,您必须从可链接方法返回test个实例。这可以是输入实例(您进行了变异),也可以是从输入复制某些属性并更改其他属性的新实例(不会改变输入)。

请查看these questions/answers的实际示例。

答案 1 :(得分:0)

如果您希望能够链接方法,可以返回this作为每个方法的返回值。但是,如果您只想按特定顺序访问某些方法,则可以返回仅实现所需接口的object,而不是返回this

在下面的示例中,method1个实例只能访问Test,但调用method1的结果是object method2 getResult功能。此外,每个返回的对象都有一个@result函数,允许您检索链接函数的结果并将class Test constructor: (one, two, three) -> @initialResult = @result = one + two + three @getResult = => result = @result @result = @initialResult result method1: (four, five) -> @result += four + five getResult: @getResult method2: (six, seven, eigth, nine) => @result += six + seven + eigth + nine getResult: @getResult t = new Test(1, 2, 3) console.log(t.getResult()) console.log(t.method1(4, 5).method2(6, 7 ,8, 9).getResult()) console.log(t.method1(1, 2).getResult()) console.log(typeof t.method2) #undefined 重置为初始结果。

还有其他方法可以保留函数调用状态,例如使用curried函数。

{{1}}

答案 2 :(得分:0)

虽然已经涵盖了方法链接,但我认为您尝试做的事情可以通过currying /部分应用来完成。如果你正在写一些更实用的东西,你基本上希望meth1接受一些参数并返回meth2,这将需要更多的参数并返回meth3,这会做一些事情使用从meth1直接传递的所有参数。

这里有一些关于currying / partial应用程序的博客文章。

http://ejohn.org/blog/partial-functions-in-javascript/

http://www.drdobbs.com/open-source/currying-and-partial-functions-in-javasc/231001821