2011-10-11 13 views
15

JavaScriptで連鎖可能な関数を作成するには?

var x, y; 
x = 'Notepad'; 
y = foo(x); 
console.log(y); // Prints 'Notepad+'. 

私は他の機能とチェーン可能だ関数を作成する方法を探しています:それの

function foo(x) { 
    x += '+'; 
    return x; 
} 

使用法は次のように次のようになります。

はこのように機能を想像することができます。

使用状況を想像してみて:

var x, y; 
x = 'Notepad'; 
y = x.foo().foo().toUpperCase(); // Prints 'NOTEPAD++'. 
console.log(y); 

私はこれをどのように行うのでしょうか?

答えて

14

確かに、トリックは、あなたがそれを修正し終わったら、オブジェクトを返すことです:

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

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

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

Stringに方法が利用できるようにするには、私はそれはプロトタイプだ修正しています。ただし、プロパティを列挙するときに問題が発生する可能性があるので、Objectではこれを行わないように注意してください。

+3

それを追加する前に、ネイティブタイプのプロパティを少なくともチェックすることは良いアイデアです。つまり、 'if(String.prototypeのfoo '){String.prototype.foo = function(){.. 。}} ' – keeganwatkins

+0

列挙を壊さずにオブジェクトを拡張したい場合は、(半近代的な)[' Object.defineProperty'](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/オブジェクト/定義プロパティ): 'Object.defineProperty(String.prototype、{value:function(){return this +";}}) 'デフォルトでは、 'enumerable'フラグは' false'に設定されています。 – Phrogz

+0

@keeganwatkinsはいそうです:)。 OPは例としてストリングだけを尋ねていたと思うので、警告を最小限に抑えましたが、それは良い点です。 –

6

私が正しく覚えていれば、 "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()を呼び出そうとします。

関連する問題