2015-12-18 67 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