有没有人有过覆盖alert()JavaScript函数的经验?
我正在尝试使用 ES6 类进行热代码重载。我需要能够修改类的构造函数,而不需要用新的类替换该类(因为其他人可能会引用它)。
然而,我发现类对象看起来好像有一些对其最初定义的构造函数的内部引用;用 实例化该类new不会查找该类 constructor 或prototype.constructor该类。
例子:
class OldC { constructor() { console.log("old"); } }
class NewC { constructor() { console.log("new"); } }
OldC.prototype.constructor = NewC.prototype.constructor;
OldC.constructor = NewC.constructor;
new OldC();Run Code Online (Sandbox Code Playgroud)
--->“旧”
(更新所有其他方法都可以正常工作;这只是我遇到问题的构造函数。)
考虑到可以通过 找到构造函数[[prototype]],我还添加了以下内容:
Object.setPrototypeOf(OldC, Object.getPrototypeOf(NewC));
Object.setPrototypeOf(OldC.prototype, Object.getPrototypeOf(NewC.prototype));
Run Code Online (Sandbox Code Playgroud)
这也没有帮助(鉴于没有发生子类化,我不会期望它会发生)。
毕竟,检查 OldC 表明原型属性完全符合我的预期,OldC.prototype.constructor是新的。但是,构造 OldC 的实例仍然会调用原始构造函数。
这是怎么回事?我该如何解决?
假设我有以下功能:
function alertMesg()
{
alert("This ok function alerts message!");
}
Run Code Online (Sandbox Code Playgroud)
现在在运行时我想更改alertMesg函数以执行其他操作.我的想法是做这样的事情.
var temp = window.alertMesg.toString.replace("ok","great")
temp = temp.replace('function alertMesg()',"");
window.alertMesg = new Function(temp);
Run Code Online (Sandbox Code Playgroud)
基本上,问题是我无法控制alertMesg函数中的源.我想更改功能,但我实际上无法更改它的来源,因为它是生成服务器端.话虽如此,我需要采取不同的行动.
PS:我忘了提到一个重要的部分:我必须保留大部分功能.我不能只是正确地替换功能.我必须保持95%的功能,并改变其他百分之五.
@Barlow Tucker,quixoto,pekka谢谢,感兴趣.
基本上,我不认为代理的想法会起作用,因为我不只是添加功能,我正在改变代码的功能.我想要例如,函数的第三行是不同的.在我的现实生活中,我必须在函数中间添加一行.