Javascript 重写原型方法并调用原始方法
我想重写Html5画布的drawImage函数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) {
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
还有一种更为简洁的方法。