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(this
this
exe()
これが私が達成しようとしていることの不十分な実装であると思われる場合、私は他のオプションを検討することを嬉しく思います。
前もって感謝します。