如何在 JavaScript 中创建可链接函数?
让我们想象这样的函数:
function foo(x) {
x += '+';
return x;
}
它的用法如下:
var x, y;
x = 'Notepad';
y = foo(x);
console.log(y); // Prints 'Notepad+'.
我正在寻找一种方法来创建可与其他函数链接的函数。
想象一下用法:
var x, y;
x = 'Notepad';
y = x.foo().foo().toUpperCase(); // Prints 'NOTEPAD++'.
console.log(y);
我将如何做到这一点?
Lets imagine function like this:
function foo(x) {
x += '+';
return x;
}
Usage of it would be like:
var x, y;
x = 'Notepad';
y = foo(x);
console.log(y); // Prints 'Notepad+'.
I'm looking for a way to create function that's chainable with other functions.
Imagine usage:
var x, y;
x = 'Notepad';
y = x.foo().foo().toUpperCase(); // Prints 'NOTEPAD++'.
console.log(y);
How would I do this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
当然,诀窍是在完成修改后返回对象:
http://jsfiddle.net/Xeon06/vyFek/
为了使该方法在
String
上可用,我正在修改它的原型。但请注意不要在Object
上执行此操作,因为在枚举其属性时可能会导致问题。Sure, the trick is to return the object once you're done modifying it:
http://jsfiddle.net/Xeon06/vyFek/
To make the method available on
String
, I'm modifying it's prototype. Be careful not to do this onObject
though, as it can cause problems when enumerating over their properties.如果我没记错的话,您可以使用“this”作为函数的上下文(它所属的对象)并返回它以使函数可链接。换句话说:
然后您可以像 obj.f1().f2() 这样链接调用。
请记住,您将无法通过调用 obj.f1() 来实现您所期望的效果.toUpperCase() - 它将执行 f1(),返回“this”并尝试调用 obj.toUpperCase()。
If I remember correctly, you can use "this" as a context of a function (object it belongs to) and return it to make the function chainable. In other words:
then you can chain the calls like
obj.f1().f2()
Keep in mind, you won't be able to achieve what you are expecting by calling obj.f1().toUpperCase() - it will execute f1(), return "this" and will try to call obj.toUpperCase().
这里有一种方法可以在不干扰
String.prototype
的情况下实现这一点,即通过返回一个类似于字符串的对象,并使用附加方法foo()
。然而,这种方法有一些缺点,即它不返回实际的字符串。Here's a way to do it without messing with
String.prototype
, by returning an object similar to a string, with an additional methodfoo()
. However, there are some downsides to this approach related to it not returning an actual string.