无法使用更多功能扩展Javascript函数

时间:2013-11-26 15:56:22

标签: javascript function override

我正在尝试覆盖我无法修改的.js文件中包含的Javascript函数(它是从未部署我们的应用程序的服务器提供的)。该函数包含其中的函数和变量。有一个子功能我需要改变它的行为,但它被另一个调用,我不能直接调用它。这是:

我无法更改的包含文件的简单版本:

com.company.topLevelFunc = function () {
  var a = null;
  var b = null;
  var doSomething = function() {
    a = foo;
    b = bar;
  };
  var get = function(cfg) {
    //do stuff
  };
  return {
    //other vars and functions here
    getValue : function (cfg) {
      cfg.url=a + b;
      get(cfg);
    }
  };
}();

我需要覆盖的函数是get(cfg)。但是,我无法直接调用它,我需要通过getValue(cfg)方法并保留顶级函数中发生的所有其他内容。所以我一直试图覆盖两者:

我的JS,我完全控制,并且不起作用,它在应用上的错误说'缺失:在属性ID之后'。我这样做是否正确,不知道如何让申请正常工作?< / p>

var topLevel = com.company.topLevelFunc;
myTopLevel = function() {
  var myGet = function(cfg) {
    //do simliar but different stuff from the original get function
  };
  return {
    topLevel.apply(this, arguments);
    getMyValue : function (cfg) {
      cfg.c= a + b +"some other string";
      //do something
      myGet(cfg);
    }
  };
}();

1 个答案:

答案 0 :(得分:0)

不幸的是,get方法是私有的。它只存在于无人访问的匿名函数体内。除了一些非常聪明的黑客和未经推荐的编程之外,你无法做任何改变它。

在这种情况下,您应该做的是更改getValue的{​​{1}}属性。你尝试这样做的方式有点不对,我会解释原因。

com.company.topLevelFunc

在此构造中,a = function() { // this is not a var c = function() { return 3; }; return { // this object is a b : c; } }(); // called immediately 不是函数。您在其中看到的函数会立即调用,并为a分配该调用的返回值。实际上这几乎是等价的:

a

为什么你会使用第一个结构而不是第二个结构是这里多次提出的问题。一个简短的回答是第一个允许你拥有其他人无法访问的私有东西(比如你的get方法)。

所以a是一个具有属性的对象,其值是一个返回3的函数。如果你想要返回4,你需要做这样的事情:

a = { b : function() { return 3; } };

这使a.b = function() { return 4; } 的其他属性保持不变(如果有的话)并且只更改您感兴趣的属性。

如果你想让b访问上面匿名函数中定义的一些私有属性,那就无法完成。