Javascript 覆盖JS原型函数

Javascript 覆盖JS原型函数,javascript,Javascript,对于个人项目,我希望在对象属性上公开的标准JS函数之后执行自定义函数 在“CanvasRenderingContext2D”的情况下,它可以 CanvasRenderingContext2D.prototype.clearRectREF = CanvasRenderingContext2D.prototype.clearRect; CanvasRenderingContext2D.prototype.clearRect = function(x, y, width, height) {

对于个人项目,我希望在对象属性上公开的标准JS函数之后执行自定义函数

在“CanvasRenderingContext2D”的情况下,它可以

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)