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语句 - 只是为了清晰起见才提出)?

回答

0

多一点的研究使我强调的bind方法,它基本上没有我没来填充工具同名ECMAScript 5的本地函数方法同样的事情 - 这似乎是我可以避开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); 
     } 
    } 
} 
相关问题