0
我在现有库的上下文中构建模块。一些库的功能 - 具体来说,LIBRARY.module.add
(为了举例:实际功能更精细) - 可以在各种情况下触发,将会破坏我的模块的用户体验,所以我需要中断它考虑到我的模块的深奥问题。暂时重新绑定然后安全地重新连接库方法
我不允许重写原始库的任何部分,也不允许我复制该库所涵盖的功能。
现有的代码是这样的:
LIBRARY.moduleX = {
two : 2,
addToTwo : function(addAnd){
return this.two + addAnd;
}
}
这里的一个关键问题是,LIBRARY
的模块都写在文本对象符号和他们的方法依赖于this
。另一个问题是代码库不断变化。我不能依靠addToTwo
的arity或类似的东西(如果有人扩展它以获得多个操作数或其他)。
所以我写了这个执行作为我的组件初始化的一部分:
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
语句 - 只是为了清晰起见才提出)?