在Internet Explorer中使用JavaScript重写外部对象的函数

问题描述:

我目前正在使用由主机应用程序提供的外部对象模型的仅限IE的项目。 Internet Explorer允许通过浏览器组件访问这个外部对象: http://msdn.microsoft.com/en-us/library/ie/ms535246(v=vs.85).aspx在Internet Explorer中使用JavaScript重写外部对象的函数

访问对象采用JavaScript函数调用的形式,类似于:

external.MethodName(arg1, arg2); 

一个最近的更改应用程序流会引进数百,甚至数千if语句这些JavaScript调用周围条件语句,例如:

if (X) { 
    external.MethodName(arg1, arg2); 
} else { 
    // do something else 
} 

而不是潜在的修改HTML成千上万的FIL es,如果我们可以重写或重写外部对象的函数以使if条件只出现在一个地方,那么似乎是有道理的。通常情况下,这可能在JavaScript来实现与:

external.OldMethodName = external.MethodName; 
external.MethodName = function(arg1, arg2) { 
    if (X) { 
     external.OldMethodName(arg1, arg2); 
    } else { 
     // do something else 
    } 
}; 

然而,这会导致“无效的过程调用或参数”脚本错误,因为你不能引用外部主机方式这种方式。

我无法访问主机应用程序专有代码来直接更改外部方法。我有什么办法可以使用JavaScript来重写外部对象的函数,或者我需要用if语句包装(潜在的)数千个调用(一个非常糟糕的做法)吗?

更新:经过与客户端的大量来回之后,我们设法联系第三方供应商更新外部主机方法,这比我们的包装方法更好前端。与此同时,我接受了保罗的答案。

使用的toString()和eval:

var foo = external.MethodName.toString().replace("OldMethodName", "MethodName").replace("bar","baz"); 
eval(foo); 
if(x) 
    { 
    external.OldMethodName(arg1,arg2); 
    } 
else 
    { 
    MethodName(arg1,arg2) 
    }