完全を期すために。さらに別の方法として、チェーンの進行に合わせて更新されるオブジェクトを渡す方法があります。これにより、いつでも結果値にアクセスできます (チェーンの最後に追加する必要はありません)。
次のような構文の代わりに:
var result = chainableFunction.doThis().doThat().result;
次に、次のようになります。
chainableFunction.update(variableToUpdate).doThis().doThat();
var result = variableToUpdate.result;
ロジックは、他の人が提案したソリューションとほとんど同じです。どちらを使用するかは、おそらくユースケースによって異なります。チェーンを .result で終了する必要がある場合に考えられる問題は、この方法を使用することを妨げるものは何もないということです:
var chainedUp = chainableFunction.doThis().doThat();
doSomething(chainedUp.result);
...
chainedUp.doOneMoreThing()
...
doSomething(chainedUp.result); // oups, .result changed!
variableToUpdate オプションを使用すると、結果の値は将来の関数呼び出しの影響を受けません。繰り返しますが、これはある状況では望ましいことですが、別の状況では望ましいことではありません。
以下の完全な例
#!/usr/bin/env node
var ChainUp = {};
(function(Class) {
// Pure functions have no access to state and no side effects
var Pure = {};
Pure.isFunction = function(fn) {
return fn && {}.toString.call(fn) === '[object Function]';
};
Class.instance = function() {
var instance = {};
var result;
var updateRef;
function callBack(fn) {
// returning a clone, not a reference.
if(updateRef) { updateRef.r = (result || []).slice(0); }
if(Pure.isFunction(fn)) { fn(result); }
}
instance.update = function(obj) {
updateRef = obj;
return instance;
};
instance.one = function(cb) {
result = (result || []); result.push("one");
callBack(cb);
return instance;
};
instance.two = function(cb) {
result = (result || []); result.push("two");
callBack(cb);
return instance;
};
instance.three = function(cb) {
result = (result || []); result.push("three");
callBack(cb);
return instance;
};
instance.result = function() {
return result;
};
return instance;
};
}(ChainUp));
var result1 = {};
var chain = ChainUp.instance().update(result1);
var one = chain.one(console.log); // [ 'one' ]
console.log(one.result()); // [ 'one' ]
console.log(result1.r); // [ 'one' ]
var oneTwo = chain.two();
console.log(oneTwo.result()); // [ 'one', 'two' ]
console.log(result1.r); // [ 'one', 'two' ]
var result2 = {};
var oneTwoThree = chain.update(result2).three();
console.log(oneTwoThree.result()); // [ 'one', 'two', 'three' ]
console.log(result2.r); // [ 'one', 'two', 'three' ]
console.log(result1.r); // [ 'one', 'two' ]
ノート。Class および instance キーワードは、おそらくなじみのないものです。これは、プロトタイプからインスタンスを構築するためにプロトタイプの継承の代わりにクロージャーを使用するときに使用する規則です。instance を self に置き換えることができます (instance = {} の代わりに self = this)。