用try-catch包装现有javascript对象的所有方法
Wrap all methods of existing javascript object with try catch
是否有一种下降方式可以用try-catch包装现有javascript对象(例如第三方库)中的所有方法,以便我可以处理执行错误?当然,我将在一个新接口下公开这些方法。
以下是我现在的想法:(将其视为伪代码)
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
只是想知道,我的上述想法有什么更好的方法或缺陷吗?谢谢
差不多了!唯一的问题是你没有正确地传递参数。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
:的性能问题
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.
}
};
}
相关文章:
- 对象文字方法上的Javascript绑定不起作用
- 如何在ajax中调用javascript对象的方法
- 解析带有嵌入式数组的JSON对象,方法
- 确定var是否是javascript中的elementFinder对象的方法是什么
- Javascript:对回调创建的对象执行方法
- 向通过ReST JSON调用生成的Angular Javascript对象添加方法
- 有没有办法在应用程序脚本中使用JavaScript为对象创建方法字典
- Rally SDK 2 标签选择器是否有必填字段?对象没有方法'getContextPath'
- 按键名调用 JSON 对象的方法有什么区别
- Box2dWeb中是否有方法将对象的位置.x输出到console.log()
- javascript构建对象.有什么区别和最好的方法
- 在反序列化JSON对象时,是否有方法将属性名称转换为小写?
- 这两种定义类/对象的方法有什么区别?
- 是否有可能发送我的对象与方法(函数)从服务器到客户端
- 有没有一种方法可以在不修改Object.prototype的情况下给所有对象一个方法?
- 这两种获取画布对象的方法有什么区别?
- 解析JSON字符串后是否有方法获得对象属性
- 检查对象是否有方法,而不实例化它
- 如果访问amazon s3对象,是否有方法调用lambda函数?
- 在Python中是否有向对象添加方法的惯用方法?