更改或覆盖javascript函数

时间:2018-06-20 08:23:14

标签: javascript google-chrome-extension userscripts

我正在尝试覆盖一些JavaScript函数。 javascript由Chrome中的Requestly extension加载。我认为所有代码都封装在一个函数中,并包装在();

// start of the file
"use strict";
!function(Bt, Xt) {
    "object" == typeof module && "object" == typeof module.exports ? 
    module.exports = Bt.document ? Xt(Bt, !0) : function(Gt) {
        if (!Gt.document)
            throw new Error("jQuery requires a window with a document");
        return Xt(Gt)
    }
    : Xt(Bt)
}("undefined" == typeof window ? this : window, function(Bt, Xt) {
    function Gt(Cr, Pr) {
        var Ar = (Pr = Pr || kn).createElement("script");
        Ar.text = Cr,
        Pr.head.appendChild(Ar).parentNode.removeChild(Ar)
    } // all the functions are defined below here

    UI.writeLine = function(a, b, c, d=!0) {
        //display a line of text in the browser window
    }

    let UI_writeLine = UI.writeLine;
    UI.writeLine = function(x, y, z) {
        Network.send() // 1. change - comment out this line
        UI_writeLine.call(a, b, c, d, !1);
    }

    let writeText = new function() {
        if (var1 == 1 || var2 == 2) // 2. change - modify this if-test
    }

// end of file
}
);

我的意图是更改已加载代码中的几行,也许只是通过请求附加加载一个JavaScript文件。我试图在正在加载的其他JavaScript文件中定义两个有趣的函数,但是似乎只有原始定义在使用中。我认为let关键字将函数设为私有吗?

我当然可以复制请求中加载的原始代码,然后更改完整的代码。但是如上所述,我只需要更改几行,并考虑在一个附加文件或一个用户脚本中覆盖它。用户脚本可能是一个复杂而混乱的选择。

尽管熟悉编程,但对javascript却不太熟悉。

2 个答案:

答案 0 :(得分:0)

从您发布的代码来看,您似乎可以传递带有注释或更改功能以满足您需要的新功能。下面的代码在我的编辑器(Webstorm 11和Quokka)中签出。您可以尝试通过请求加载它。

'use strict'
!function (Bt, Xt) {
  'object' === typeof module && 'object' === typeof module.exports ? module.exports = Bt.document ? Xt(Bt, !0) : function (Gt) {
      if (!Gt.document)
        throw new Error('jQuery requires a window with a document')
      return Xt(Gt)
    }
    : Xt(Bt)
}(myFunction())


function myFunction () {
  return 'undefined' === typeof window ? this : window, function (Bt, Xt) {
    function Gt (Cr, Pr) {
      let Ar = (Pr = Pr || kn).createElement('script')
      Ar.text = Cr
      Pr.head.appendChild(Ar).parentNode.removeChild(Ar)
    } // all the functions are defined below here

    UI.writeLine = function (a, b, c, d = !0) {

    }

    let UI_writeLine = UI.writeLine
    UI.writeLine = function (x, y, z) {
      //Network.send() // 1. change - comment out this line
      UI_writeLine.call(a, b, c, d, !1)
    }

    let writeText = function () {
      if (var1 === 'my value 1' || var2 === 'my value 2') { // 2. change - modify this if-test
        // Do what I need
      }
    }
    // end of file
  }

}

您可以在javascript中利用的一个鲜为人知的事实是,您可以覆盖诸如变量之类的表达函数。

enter image description here

答案 1 :(得分:0)

简而言之,您的代码遵循此结构

function(windowArg, functionArg) {

}(window, function(a, b) {
  // Some Private functions here

  UI.writeLine = function() { ... } // First definition

  let UI_writeLine = UI.writeLine;  // Holds reference to above definition

  UI.writeLine = function(x, y, z) { // New definition for UI.writeLine
    Network.send() // 1. change - comment out this line
    UI_writeLine.call(a, b, c, d, !1);
  }

  let writeText = new function() { // Private function
    if (var1 == 1 || var2 == 2) 
  }
});

现在,看看我提到的评论。借助外部脚本,您可以覆盖UI.writeLine的定义并注释所需的代码。

因此,如果您再定义一个这样的脚本

(function() {
  UI.writeLine = function() {
    // Network.send()
    ... Other Code
  }
}());

并在上一个脚本之后使用Requestly插入它。您应该能够看到您的代码正在执行,因为您将UI.writeLine的引用更改为新函数。

但是writeTest是函数中的私有函数,您可以通过外部脚本编写修改。

在这种情况下,建议您修改原始脚本并在其中注释代码。使用Requestly Library来托管文件,在此处进行修改,添加适当的注释并复制url并使用Requestly插入。您可以尝试Library feature here

免责声明:此处是请求创建人。