Javascript 覆盖JS原型函数
对于个人项目,我希望在对象属性上公开的标准JS函数之后执行自定义函数 在“CanvasRenderingContext2D”的情况下,它可以Javascript 覆盖JS原型函数,javascript,Javascript,对于个人项目,我希望在对象属性上公开的标准JS函数之后执行自定义函数 在“CanvasRenderingContext2D”的情况下,它可以 CanvasRenderingContext2D.prototype.clearRectREF = CanvasRenderingContext2D.prototype.clearRect; CanvasRenderingContext2D.prototype.clearRect = function(x, y, width, height) {
CanvasRenderingContext2D.prototype.clearRectREF = CanvasRenderingContext2D.prototype.clearRect;
CanvasRenderingContext2D.prototype.clearRect = function(x, y, width, height) {
this.clearRectREF(x, y, width, height);
makeXMLHttpRequest("/", "POST");
}
这将在“clearRectREF”函数中存储对“clearRect”函数的引用
CanvasRenderingContext2D.prototype.setTransform = (function(){
const original = CanvasRenderingContext2D.prototype.setTransform;
return function(){
const res = original.apply(this, arguments);
//do something else
return res;
}
})();
某些JS函数具有不同的方法签名,例如“CanvasRenderingContext2D.setTransform”
根据MDN Web文档,此方法的签名为:
ctx.setTransform(a, b, c, d, e, f);
ctx.setTransform(matrix);
这让我有点困惑,因为JS不支持方法重载。
这在浏览器中是如何实现的?当此函数有两个不同的签名时,我如何存储对此函数的引用
我需要这样做,因为我无法修改应用程序的JS,所以使用Selenium时我使用了这种方法…虽然JavaScript确实不支持方法重载,但它的所有函数都是可变的,可以简单地检查传递给函数的参数数量
CanvasRenderingContext2D.prototype.setTransform = (function(){
const original = CanvasRenderingContext2D.prototype.setTransform;
return function(){
const res = original.apply(this, arguments);
//do something else
return res;
}
})();
例如:
function setTransform(a,b,c,d,e,f,){
if(arguments.length === 1){
//only use first argument, which should be a matrix
const matrix = a;
} else {
//use a,b,c,d,e,f
}
}
它实际上只有一个函数
,因此可以使用扩展语法或函数#apply
为其提供所有参数。IIFE可用于避免对原始函数的全局引用
CanvasRenderingContext2D.prototype.setTransform = (function(){
const original = CanvasRenderingContext2D.prototype.setTransform;
return function(){
const res = original.apply(this, arguments);
//do something else
return res;
}
})();
这在浏览器中是如何实现的?当此函数有两个不同的签名时,我如何存储对此函数的引用
它仍然只是一个函数,但可以使用不同数量的参数和/或不同类型的值调用,并且在内部可以区分这些参数和/或值。有关示例,请参见或
在包装功能中,可以使用and或QUOTE and来实现相同的效果:
CanvasRenderingContext2D.prototype.clearRect = function(...args) {
this.clearRectREF(...args);
makeXMLHttpRequest("/", "POST");
};
你不需要知道参数的数量。只需使用CanvasRenderingContext2D.prototype.clearRect=函数(…args){this.clearRectREF(…args);}代码>。你真的需要修改原型吗?如果是这样,请使用中的模式来正确执行。小心!!如果OP使用箭头函数会发生什么情况?@Ele但他没有,而且他在编写方法时不能。谢谢你的解释。@Ele你能解释一下你的意思吗?@Ele
const fn=(…args)=>console.log(args.length)
。