比如,有这样一个方法,该方法可以不断链式调用自己,并且叠加输入内容最后输出。 看着似乎挺简单的,于是按照网上的资料,我简单写了一个
var Chain={ sav: '', a1:function(val){ this.sav = this.sav + val return this; } }; Chain.a1('aaa').a1('bbb').a1('ccc'); console.log(Chain.sv); //返回 aaabbbccc
emm,好像哪里不对,想了想,原来是 return 被 this 占用了,没法输出最终的参数。
现在有一需求:
如何能够让 a1 这个函数,能够意识到已经是链式调用的末尾了,从而不再 return 自己( this ), 而是输出实际需要的内容呢?
虽然可以准备一个函数专门返回 sav 的内容,这的确可以做到(比如我准备一个名为 show 的函数,里面直接返回 sav 的值):Chain.a1('aaa').a1('bbb').a1('ccc').show();
但专门写一个 function 比较麻烦,总是跟着个小尾巴每次调用也麻烦。
网上查了查,似乎没有什么有用资料。希望有熟悉 js 的 v 友指教一下,谢谢~
![]() | 1 geelaw 2019-08-31 12:54:29 +08:00 via iPhone 这是不可能的,考虑 var some = obj.cascade(1); if (SomeFunc()) { console.log(some.cascade(2)); } else { console.log(some); } 决定是否应该返回你想要的另一个结果归结为判断 SomeFunc 是否返回真值,但这是一个不可判定问题。 |
![]() | 2 ianva 2019-08-31 13:03:01 +08:00 最基本的原型方法都不明白怎么写的明白? ``` class Chain { constructor(){ this.save = "" } add(value){ this.save = this.save + value; return this; } } ``` |
![]() | 3 ipwx 2019-08-31 13:16:32 +08:00 via Android |
![]() | 4 mostkia OP @ipwx 恩,这样的确也是可以的(至少不用准备一个 show 函数了),但末尾需要额外增加 n+1 的调用,比如 ``` var Chain={ sav: '', a1:function(val){ if(val == null){ return Chain.sav; } this.sav = this.sav + val return this; } }; Chain.a1('aaa').a1('bbb').a1('ccc').a1(); //返回 aaabbbccc ``` 目前看来还是没有很好的解决方案的样子。 |
![]() | 5 otakustay 2019-08-31 13:29:34 +08:00 你可以不需要最后那个.a1(),一个对象能实际被显示到屏幕上,或参与其它运算,绝大多数是要走 toString()和 valueOf()的,重写这 2 个就行 |
![]() | 6 ianva 2019-08-31 13:31:44 +08:00 那换个玩法,https://codesandbox.io/s/reverent-kilby-wiic3 重写 toString,或者 valueOf 可以打到部分效果 |
![]() | 7 autoxbc 2019-08-31 13:34:09 +08:00 via iPhone 自我链式调用的场景: 单个对象有多种方法,为了简易拼接这些方法,使得每个方法刚好接收自己的参数,而又不把这些方法和其参数都写在一整个参数序列里,才有了链式调用 你这个场景,不要强拗,单函数多参数就完了 |
![]() | 8 flowfire 2019-08-31 15:05:36 +08:00 via iPhone valueOf 和 toString 了解一下 |
![]() | 9 flowfire 2019-08-31 15:08:40 +08:00 via iPhone 另外你这个不叫链式调用,你这个叫 柯里化 |
![]() | 11 sunjourney 2019-08-31 17:32:59 +08:00 用 show 是正途,行为需要明确 |