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); 
     } 
    } 
} 
相關問題