既存のライブラリのコンテキストでモジュールを構築しています。ライブラリの機能の一部 (具体的には、LIBRARY.module.add
(例: 実際の機能はもっと複雑です)) は、あらゆる種類のシナリオでトリガーされる可能性があり、モジュールの UX を破壊するため、それを考慮して中断する必要があります。私のモジュールの難解な懸念。
元のライブラリのどの部分も書き直すことは許可されておらず、ライブラリでカバーされていると思われる機能を複製することも許可されていません。
既存のコードは次のようなものです。
LIBRARY.moduleX = {
two : 2,
addToTwo : function(addAnd){
return this.two + addAnd;
}
}
ここで重要な問題は、LIBRARY
のモジュールはすべてリテラル オブジェクト表記で記述されており、それらのメソッドは に依存していることthis
です。もう 1 つの懸念事項は、コード ベースが常に流動的であることです。のアリティなどに頼ることはできませんaddToTwo
(誰かがそれを拡張して複数のオペランドなどを取る場合)。
したがって、コンポーネントの初期化の一部として実行するようにこれを記述しました。
void function handleModuleX(){
// Keep a reference before rebinding
var LIBRARY_moduleX_addToTwo = LIBRARY.moduleX.addToTwo;
// Restores the original binding
function rebind(){
LIBRARY.moduleX.addToTwo = function(){
return LIBRARY_moduleX_addToTwo.apply(LIBRARY.moduleX, arguments);
}
}
// Rebind to consider local logic
LIBRARY.moduleX.addToTwo = function handleEsotericLogic(){
if(unresolvedConcerns){
stuff();
}
else {
rebind();
LIBRARY.moduleX.addToTwo();
}
}
}();
これはうまくいくようです。私の懸念は、最終的に再バインドの安全性と読みやすさにあります。
- この手法は、何の仮定もしていない限り、防弾
addToTwo
ですか? - これは、元のバインディングの復元に可能な限り近いですか?
- 非常に多くのスコープをネストせずに同じ機能を実現できます
rebind
かelse
?