在调用对象函数之前,覆盖外部脚本中的对象函数
Overwrite an object function from an external script before it is called
我正试图编写一个Greasemonkey脚本或Userscript来修复网站中的一个错误,该错误处理对象的错误函数。我可以手动解决这个问题,方法是在生成函数原型的代码行添加断点,并使用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
如果我将代码Ft.prototype.J = function() {} //my own function
添加到我的防油精脚本中,它会像预期的那样返回错误Ft not defined
。但是,如果我在加载结束时执行这一行,那么损坏的函数已经运行,DOM也已经被感染。
谢谢。
我认为您可以用getters/ssetters和Object.defineProperty
执行一些魔术,因为函数是全局声明的:
(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);
相关文章:
- 创建对象函数原型和代码是错误的
- JavaScript模块模式-如何在使用对象/函数之前激发构造函数/init函数
- 如何从onclick字符串中引用javascript对象函数
- 更改对象函数仅用于示例
- javascript和jQuery的嵌套对象函数中的变量范围
- 将对象函数传递给请求动画帧时丢失对象引用
- 对象函数返回函数而不是值
- 使用onclick调用属性对象函数
- javascript拉斐尔对象函数传递
- 如何从onClick事件调用对象函数
- 可以't获取具有“t”的对象变量;这个“;由setTimeout()函数调用的对象函数中的属性
- 对象没有't继承父对象函数
- 调用父对象函数
- "这个“;对象函数内部的引用
- 将变量添加到对象函数调用的末尾
- 传单错误:对象函数没有方法'createIcon'在LayerGroup中创建自定义图标标记时
- TypeError:对象函数Object(){〔本机代码〕}没有方法'方法'
- 挖空 - 单击绑定到对象函数 - 范围问题
- 类型错误: 对象函数...没有方法“打开”
- JavaScript 对象函数