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
語句 - 只是爲了清晰起見才提出)?