2015-12-18 100 views
1

JavaScript對象的所有方法有一個下降的方式來包裝現有的JavaScript對象與嘗試捕捉所有方法(例如第三方庫),這樣我可以處理exeception錯誤?當然,我會在一個新的界面下公開這些方法。包裝現有的與嘗試捕捉

這是我心目中現在:(認爲它是僞代碼)

var MyInterface = {}; 
for (var property in thirdPartyLib) { 
    if ((typeof thirdPartyLib[property]) === 'function'){ 
    MyInterfac[property] = function(){ 
     try { 
     thirdPartyLib[property](arguments) 
     } 
     catch(err){ 
     //do my custom processing 
     } 
    } 
    } 
} 

//developer use MyInterface object 

只是想知道,任何更好的方法或任何瑕疵與我上面的想法?謝謝。

+0

'(typeof thirdPartyLib [property])'不需要用圓括號包裝。 – RobG

回答

2

差不多!唯一的問題是你沒有正確傳遞參數。 arguments是包含的傳遞給函數調用的參數的所有僞陣列對象。你的代碼現在最終會發生什麼,就是真正的函數會被一個單獨的對象調用,而不是你在包裝函數中收到的單個參數。

還可以做什麼用的封閉只是做一個就地包裝,所以你不必擔心使用不同的對象。

function safeWrap(service, fn) { 
    var ogFn = service[fn]; 
    service[fn] = function() { 
     try { return ogFn.apply(service, arguments); } 
     catch (err) { 
      // doh. 
     } 
    }; 
} 

function wrapObj(service) {  
    for (var fn in thirdPartyLib) { 
     var type = typeof(thirdPartyLib[fn]); 
     if (type === 'function') { 
      safeWrap(thirdPartyLib, fn); 
     } else if (type === 'object') { 
      wrapObj(thirdPartyLib[fn]); 
     } 
    } 
} 

wrapObj(thirdPartyLib); 

編輯來讓包裝遞歸,每@ RobG的建議

如果性能是一個問題,您可以手動傳遞參數,以避免使用Function.apply的PERF命中:

function safeWrap(service, fn) { 
    var ogFn = service[fn]; 
    service[fn] = function (a, b, c, d, e, f, g, h, i, j, k, l) { 
     if (arguments.length > 12) { 
      console.error('Time to add %s more args!', arguments.length - 12); 
     } 
     try { return ogFn.call(service, a, b, c, d, e, f, g, h, i, j, k, l); } 
     catch (err) { 
      // doh. 
     } 
    }; 
} 
+1

這是一種淺層包裝。 ;-)它應該是遞歸的,因爲許多圖書館都有深度超過一個對象的方法,例如, 'myLib.dom.getElement()'。任何估計的性能打擊這個? – RobG

+0

Whups,好點!已更新以使其遞歸。我不希望最初的設置有一個大的perf命中,因爲它只需要做一次。這裏有一個關於try/catch語句PERF的問題:http://stackoverflow.com/questions/19727905/in-javascript-is-it-expensive-to-use-try-catch-blocks-even-if-an-exception-is -n ...但它看起來像主要風險將使用適用()VS直接函數調用:http://stackoverflow.com/questions/8184466/why-are-call-and-apply-slower-than-一個直接功能,通話中的JavaScript。如果最大可能的perf是一個問題,您可以始終通過手動傳遞參數。 –

+0

謝謝!像魅力一樣工作! – Rana