Как сделать функцию привязки в 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);

Как мне это сделать?

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

Если я правильно помню, вы можете использовать "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().