0

DRYの原則を守るために、function.call()呼び出しの数を減らすために、関数のプロトタイプを修正することにしました。

以下は、私が現在持っているものの抜粋であり、私がやろうとしていることについてさらに明確にしています。

com.domain.$ = function(s){
     if(!this){return new com.domain.$(s);}

    this.selector = s;
    this.elements = document.querySelectorAll(s);
}

com.domain.$.prototype = (function(){
    function exe(f){
        var e = this.elements,
            el = e.length;
        for(var i=0; i<el; i++){
            f(e[i]);
        }
    }

    function addClass(c){exe.call(this,function(el){el.classList.add(c);});}
    function removeClass(c){exe.call(this,function(el){el.classList.remove(c);});}
    function toggleClass(c){exe.call(this,function(el){el.classList.toggle(c);});}

    return {
        addClass:addClass,
        removeClass:removeClass,
        toggleClass:toggleClass
    }
}());

これは、jQueryの機能を模倣しようとしているように見えることに気づきました。意図的ではありますが、これは代替として機能することを意図したものではなく、JavaScriptの個人的な理解を深めることを目的としています。

とは言うものの、私がやりたいのは、コンテキストを私が望むものにするために、exe()viaを呼び出す必要をなくすことです。私はこれを関数バインディング()を介して実行できると信じていますが、おそらく私が望む方法ではありません。代わりに次のようなことを行うことが可能であることを理解しています。exe.call(this[, fnc]);this.bind()

com.domain.$.prototype.exe = function(){}

そしてそれを次のように呼びます:

function addClass(c){this.exe(function(){});}

ただし、そうexe()することで、元のコードのクロージャーによって提供されるプライベートな可視性が失われます。可能であれば、それをそのままにしておきたいと思います。

それでは、私の質問は、の冗長な使用を減らし、内の正しいコンテキストを所有し、クロージャー内のプライベートな可視性を維持exe()できるような方法で、元のコード内にバインドできるかどうかです。exe.call(thisthisexe()

これが私が達成しようとしていることの不十分な実装であると思われる場合、私は他のオプションを検討することを嬉しく思います。

前もって感謝します。

4

1 に答える 1

1

いいえ、定義する時点では、exe()呼び出したいインスタンスexe()がまだ存在しないため、できません。

実際、を複数回呼び出すcom.domain.$場合は、異なるインスタンスで使用するため、特定のexe()インスタンスにバインドすることは意味がありません。exe()

これを実行したい場合は、コンストラクター内でこれらすべてのメソッドを定義する必要があり、プロトタイプのすべての利点が失われます。

(function() {
    function exe(f){
        // ...
    }

    com.domain.$ = function(s){
        // ...

        var exe_ = exe.bind(this);
        this.addClass = function(c) {
             exe_(function(el){el.classList.add(c);});
        };
        // ...
    };
}());

を使用したくない場合は、要素の配列を引数として受け入れ、プロトタイプ関数から渡すよう.callに変更することをお勧めします。なぜ使う必要があるのか​​全くわかりません。これは、配列の各要素を特定の関数に渡す単なるヘルパーであり、より一般的にすることで、再利用が容易になります。 例えば:exe()this.elementsexe()this

var com.domain.$ = (function(o) {
    function exe(arr, f){
        var el = e.length;
        for(var i=0; i<el; i++){
            f(arr[i]);
        }
    }

    var $ = function(s){
         // ...
    }

    $.prototype.addClass = function(c){
        exe(this.elements, function(el){
            el.classList.add(c);
        });
    };
    // ... 

    return $;
}());
于 2012-08-24T17:30:00.293 に答える