我目前正在尝试在咖啡脚本中制作需要嵌套方法的东西。我想要这样的东西。
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进行交互。
我一直在尝试各种方法,但到目前为止还没有完全有效。
答案 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