我正在编写 javascript 上下文对象的扩展。
我想要达到的目标:
最后,我想要一个只接受一个参数的函数,画布。从那里开始,它应该使用我将自己编写的各种额外功能扩展该画布元素。
所以基本上,将画布变成特殊画布如下:
html
<canvas id='normal'></canvas>
<canvas id='special'></canvas>
Javascript
var normal = document.getElementById("normal"),
special = document.getElementById("special");
var Extendedctx = function (canvas) {
// Magic?
}
Extendedctx(special); // Extends the "special" canvas's context (ctx) with lots of extra functionality.
special.getContext('2d').nonBuiltinFunction(); // Should work
normal.getContext('2d').nonBuiltinFunction(); // Should throw an exception
然而,正常的画布应该保持完全相同。因此,扩展内置 ctx-object 的原型并不是一个可行的解决方案。
我正在尝试通过执行以下操作来实现这一目标:
var canvas = document.getElementById('testcanvas'),
ctx = canvas.getContext('2d'),
Extendedctx = function (canvas) {
this.canvas = canvas;
this.ctx = canvas.getContext('2d');
this.__proto__ = Object.create(this.ctx);
return this
}, pad = new Extendedctx(canvas);
pad.fillRect(0, 0, 40, 40);
但是,最后一行出现以下异常:
Uncaught TypeError: Illegal invocation
根据以下 SO post 报价,这应该是有道理的:
在您的代码中,您将本机方法分配给自定义对象的属性。当您调用 support.animationFrame(function () {}) 时,它会在当前对象(即支持)的上下文中执行。原生 requestAnimationFrame 函数要正常工作,必须在 window 的上下文中执行
所以,要解决这个问题,你必须打电话pad.fillRect.call(pad.ctx, 0, 0, 40, 40);
现在,这会很快变得烦人和混乱。我想要结束的是:
pad.fillRect(0, 0, 40, 40);
可以简单地工作,以及我可能想要使用的任何其他继承函数 ( eg ctx.arc
)
我真的不知道该怎么做,我试着用谷歌搜索“改变javascript中的函数调用”之类的东西。没有真正有用的结果。