Как сделать цепную функцию в JavaScript? - PullRequest
21 голосов
/ 11 октября 2011

Давайте представим, что функция выглядит следующим образом:

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);

Как бы я это сделал?

Ответы [ 2 ]

20 голосов
/ 11 октября 2011

Конечно, уловка в том, чтобы вернуть объект, как только вы закончите его изменение:

String.prototype.foo = function() {
    return this + "+";
}

var str = "Notepad";
console.log(str.foo().foo().toUpperCase());

http://jsfiddle.net/Xeon06/vyFek/

Чтобы сделать метод доступным на String,Я модифицирую его прототип.Будьте осторожны, не делайте этого на Object, так как это может вызвать проблемы при перечислении их свойств.

8 голосов
/ 11 октября 2011

Если я правильно помню, вы можете использовать «this» в качестве контекста функции (объекта, которому она принадлежит) и вернуть его, чтобы сделать функцию цепной.Другими словами:

var obj = 
{
    f1: function() { ...do something...; return this;},
    f2: function() { ...do something...; return this;}
}

тогда вы можете объединить вызовы, как obj.f1().f2()

Имейте в виду, вы не сможете достичь того, чего ожидаете, позвонив по адресу obj.f1() .toUpperCase () - он выполнит f1 (), вернет «this» и попытается вызвать obj.toUpperCase ().

...