如何在另一个函数中覆盖JS函数?

时间:2017-02-08 08:09:27

标签: javascript shared-libraries sharepoint-2013

我处于覆盖另一个函数内部的js函数的位置。

例如:

function parentMethod(){
   function someOtherMethod(){
      alert("Am someone")
   }
   function childMethod(){
      alert("Am Child")
   }
   childMethod()
}

childMethod = function(){
      alert("Am Child New")
   }

实际上我想要覆盖sharepopint提供的开箱即用的js scirpt的子函数。如果我覆盖parentMethod它正常工作但它会产生1300行代码重复,因为我们是实际上覆盖了许多可用功能中的一个。

如何在没有代码重复的情况下实现它。 任何帮助将不胜感激。

提前致谢。

2 个答案:

答案 0 :(得分:3)

除非正确定义父函数,否则您提到的childMethod在父级范围之外是不可访问的,即您尝试访问的childMethod未链接到父级。 e.g。

var parentMethod = function (){
   this.someOtherMethod = function (){
      alert("Am someone")
   }
   this.childMethod = function(){
      alert("Am Child")
   }
}

没有正确的方法来实现父类的当前状态,但是为了一个工作示例,我做了一个工作小提琴。 https://jsfiddle.net/eaqnnvkz/

var parentMethod = {
  someOtherMethod: function() {
    alert("Am someone")
  },

  childMethod: function() {
    alert("Am Child")
  }
};

parentMethod.childMethod();
parentMethod.childMethod = function() {
  alert("Am Child New")
};

parentMethod.childMethod();

答案 1 :(得分:0)

不幸的是,除非编写脚本以将子函数附加到可访问的作用域,否则无法有选择地覆盖它。默认情况下,函数内部的函数不能单独访问。

尝试这种方法可能是通过parentMethod()获取parentMethod.toString()的来源,然后使用正则表达式替换子方法,然后替换原始方法使用eval()更改版本的函数的版本。这可能不是一个长期的解决方案,我个人不鼓励它,但它理论上会达到要求的效果。