0

既存のライブラリのコンテキストでモジュールを構築しています。ライブラリの機能の一部 (具体的には、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ですか?
  • これは、元のバインディングの復元に可能な限り近いですか?
  • 非常に多くのスコープをネストせずに同じ機能を実現できますrebindelse?
4

1 に答える 1

0

もう少し調べてみると、アンダースコアのメソッドにたどり着きました。これは、 ECMAScript 5bindの同じ名前のネイティブ関数メソッドをポリフィルするために行ったのと基本的に同じことです。これが、上記の実装に含まれる2つのクロージャを回避できる唯一の方法のようです。 。これで、コードがより冗長になりました。可能であれば、ライブラリのメソッドの呼び出しがスタックトレースのコードをバウンスするというアイデアが本当に好きではなかったためです(触れたことがないようです)。

function rebind(){
    if(Function.prototype.bind){
        LIBRARY.moduleX.addToTwo = LIBRARY_moduleX_addToTwo.bind(LIBRARY.moduleX);
    }
    else {
        LIBRARY.moduleX.addToTwo = function(){
            return LIBRARY_moduleX_addToTwo.apply(LIBRARY.moduleX, arguments);
        }
    }
}
于 2013-03-20T14:58:49.600 に答える