为了保持 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()
在我的原始代码中进行绑定,从而减少对 的冗余使用,为withinexe.call(this
拥有正确的上下文,并在闭包中保持私有可见性?this
exe()
如果这似乎是我想要完成的一个糟糕的实现,我很乐意考虑其他选择。
先感谢您。