我正在尝试覆盖一些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却不太熟悉。
答案 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中利用的一个鲜为人知的事实是,您可以覆盖诸如变量之类的表达函数。
答案 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
免责声明:此处是请求创建人。