Javascript 在调用对象函数之前,从外部脚本覆盖该函数

Javascript 在调用对象函数之前,从外部脚本覆盖该函数,javascript,Javascript,我正在尝试编写一个Greasemonkey脚本或Userscript来修复网站中的一个bug,该bug处理对象的错误函数。我可以手动修复这个问题,方法是在生成函数原型的代码行添加一个断点,然后使用js控制台手动覆盖函数原型。然而,我不认为有任何方法可以用代码实现这一点。外部脚本加载在html正文的末尾,但问题代码在同一脚本中执行 有没有办法将javascript代码注入页面,以便在创建Ft.prototype.J时,我可以立即修改它?问题是代码也被模糊化和缩小了,所以我不确定它的一半功能是什么

我正在尝试编写一个Greasemonkey脚本或Userscript来修复网站中的一个bug,该bug处理对象的错误函数。我可以手动修复这个问题,方法是在生成函数原型的代码行添加一个断点,然后使用js控制台手动覆盖函数原型。然而,我不认为有任何方法可以用代码实现这一点。外部脚本加载在html正文的末尾,但问题代码在同一脚本中执行

有没有办法将javascript代码注入页面,以便在创建Ft.prototype.J时,我可以立即修改它?问题是代码也被模糊化和缩小了,所以我不确定它的一半功能是什么

下面是代码的基本摘要:

//What does this do?????
function A(a, b) {
    function c() {}
    c.prototype = b.prototype;
    a.f = b.prototype;
    a.prototype = new c;
    a.prototype.constructor = a
}

function Ft(a, b) {
    $.call(this, b);
    //some stuff
}
//doing something with jQuery?
A(Ft, $);
Ft.prototype.J = function (a) {
   //modifies the DOM content
};
//Code soon after that calls some object.J
如果我在greasemonkey脚本中添加代码
Ft.prototype.J=function(){}//我自己的函数
,它会像预期的那样返回错误,
Ft未定义
。但是,如果我在加载结束时执行该行,则已中断的函数已经运行,DOM已经受到感染


谢谢。

我认为您可以使用getter/setter执行一些魔术,因为函数是全局声明的:

(function() {
    var Ft;
    function myJ() {
        // do whatever YOU want to do
    }
    Object.defineProperty(window, "Ft", { // use unsafeWindow in GM?
        configurable: true,
        enumerable: true,
        get: function() { return Ft; },
        set: function(n) {
            // Hah, we've catched the function declaration!
            Ft = n;

            // just making it non-writable would lead to an exception
            Object.defineProperty(Ft.prototype, "J", {
                get: function() { return myJ; },
                set: function() { /* ignore it! */ }
            });
        }
    });
})();

现在,如果有人执行您在问题中发布的代码,将调用setter,您可以根据需要处理这些值。

不确定,但您基本上可以编写一个计时器代码,检查Ft对象是否可用,然后修改函数,如

var interval = setInterval(function() {
    if (Ft) {
       Ft.prototype.J = function() {} //my own function
       clearInterval(interval)
    }
}, 0);

A
是常见的
inherit
函数,但是我很确定它不适用于我现在看到的jQueryOh,谢谢。这实际上是Google Play网站上的代码,所以我希望他们做得对……我忘了提到它,但是这个对象有很多功能,看起来只有在有一个原型的情况下,这个才可以处理这个问题。另外,出于测试目的,我添加了一个
console.log(“test”)
,但没有出现任何结果。您是否尝试过我在评论中提到的
unsafeWindow