Javascript 重写原型方法并调用原始方法

Javascript 重写原型方法并调用原始方法,javascript,html,canvas,Javascript,Html,Canvas,我想重写Html5画布的drawImage函数 var p = CanvasRenderingContext2D.prototype.drawImage; CanvasRenderingContext2D.prototype.drawImage = function() { var len = arguments.length; var ig, sx, sy, swidth, sheight, x, y, width, height if (len === 3) {

我想重写Html5画布的drawImage函数

var p = CanvasRenderingContext2D.prototype.drawImage;
CanvasRenderingContext2D.prototype.drawImage = function() {
    var len = arguments.length;
    var ig, sx, sy, swidth, sheight, x, y, width, height
    if (len === 3) {
        p(arguments[0], arguments[1] * 2, arguments[2] * 2, this);
    } else if (len === 5) {
        //Uncaught TypeError: Illegal invocation.
        p(arguments[0], arguments[1] * 2, arguments[2] * 2, arguments[3] * 2, arguments[4] * 2, this); 
    } else if (len === 9) {
        p(arguments[0], arguments[1] * 2, arguments[2] * 2, arguments[3] * 2, arguments[4] * 2, arguments[5] * 2, arguments[6] * 2, arguments[7] * 2, arguments[8] * 2, this);
    }
}
并按如下方式调用函数

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
但是它在注释行中抛出了一个错误。
重写原型方法后,如何调用原始方法。

您必须说
p.call
p.apply
,才能在正确的上下文中执行它

if (len === 3) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2);
} else if (len === 5) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2, arguments[3] * 2, arguments[4] * 2); 
} else if (len === 9) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2, arguments[3] * 2, arguments[4] * 2, arguments[5] * 2, arguments[6] * 2, arguments[7] * 2, arguments[8] * 2);
}
编辑:原因如下。当您调用javascript函数时,默认情况下,它在
窗口的上下文中执行。这意味着关键字
this
引用窗口(它不应该引用窗口;当调用
drawImage
时,
this
应该引用画布元素)。通过覆盖默认上下文,
窗口
,可以将其更改为正确的上下文

例如:

var w = document.write;
// Error
w("Test");
// Works
w.call(document, "Test");

您必须说
p.call
p.apply
,才能在正确的上下文中执行它

if (len === 3) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2);
} else if (len === 5) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2, arguments[3] * 2, arguments[4] * 2); 
} else if (len === 9) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2, arguments[3] * 2, arguments[4] * 2, arguments[5] * 2, arguments[6] * 2, arguments[7] * 2, arguments[8] * 2);
}
编辑:原因如下。当您调用javascript函数时,默认情况下,它在
窗口的上下文中执行。这意味着关键字
this
引用窗口(它不应该引用窗口;当调用
drawImage
时,
this
应该引用画布元素)。通过覆盖默认上下文,
窗口
,可以将其更改为正确的上下文

例如:

var w = document.write;
// Error
w("Test");
// Works
w.call(document, "Test");

您必须说
p.call
p.apply
,才能在正确的上下文中执行它

if (len === 3) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2);
} else if (len === 5) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2, arguments[3] * 2, arguments[4] * 2); 
} else if (len === 9) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2, arguments[3] * 2, arguments[4] * 2, arguments[5] * 2, arguments[6] * 2, arguments[7] * 2, arguments[8] * 2);
}
编辑:原因如下。当您调用javascript函数时,默认情况下,它在
窗口的上下文中执行。这意味着关键字
this
引用窗口(它不应该引用窗口;当调用
drawImage
时,
this
应该引用画布元素)。通过覆盖默认上下文,
窗口
,可以将其更改为正确的上下文

例如:

var w = document.write;
// Error
w("Test");
// Works
w.call(document, "Test");

您必须说
p.call
p.apply
,才能在正确的上下文中执行它

if (len === 3) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2);
} else if (len === 5) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2, arguments[3] * 2, arguments[4] * 2); 
} else if (len === 9) {
    p.call(this, arguments[0], arguments[1] * 2, arguments[2] * 2, arguments[3] * 2, arguments[4] * 2, arguments[5] * 2, arguments[6] * 2, arguments[7] * 2, arguments[8] * 2);
}
编辑:原因如下。当您调用javascript函数时,默认情况下,它在
窗口的上下文中执行。这意味着关键字
this
引用窗口(它不应该引用窗口;当调用
drawImage
时,
this
应该引用画布元素)。通过覆盖默认上下文,
窗口
,可以将其更改为正确的上下文

例如:

var w = document.write;
// Error
w("Test");
// Works
w.call(document, "Test");

使用p.call(this,…)而不是一个简单的命名调用。看起来您的调用只是按因子2进行扩展。使用情境量表(2,2);是一种更好的方法。使用p.call(this,…)而不是一个简单的命名调用。看起来你只是在按因子2进行缩放。使用情境量表(2,2);是一种更好的方法。使用p.call(this,…)而不是一个简单的命名调用。看起来你只是在按因子2进行缩放。使用情境量表(2,2);是一种更好的方法。使用p.call(this,…)而不是一个简单的命名调用。看起来你只是在按因子2进行缩放。使用情境量表(2,2);是一种更好的方法。他正在修改参数(例如,将第二个参数乘以2等)。你是对的@soktinpk,我的错。与单独列出所有参数相比,使用简单循环和
apply
还有一种更不冗长的方法。他正在修改参数(即,将第二个参数乘以2等)。你是对的@soktinpk,我的坏消息。与单独列出所有参数相比,使用简单循环和
apply
还有一种更不冗长的方法。他正在修改参数(即,将第二个参数乘以2等)。你是对的@soktinpk,我的坏消息。与单独列出所有参数相比,使用简单循环和
apply
还有一种更不冗长的方法。他正在修改参数(即,将第二个参数乘以2等)。你是对的@soktinpk,我的坏消息。与单独列出所有参数相比,使用简单循环和
apply
还有一种更为简洁的方法。