javascript コンテキスト オブジェクトの拡張機能を作成しています。
私が達成したいこと:
最後に、canvas という引数を 1 つだけ取る関数が必要です。そこから、自分で作成するあらゆる種類の追加機能を使用してそのキャンバス要素を拡張する必要があります。
したがって、基本的には、次のようにキャンバスを特別なキャンバスに変換します。
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 投稿の引用によると、これは理にかなっています。
コードでは、ネイティブ メソッドをカスタム オブジェクトのプロパティに割り当てています。support.animationFrame(function () {}) を呼び出すと、現在のオブジェクト (つまりサポート) のコンテキストで実行されます。ネイティブの requestAnimationFrame 関数が正しく機能するには、window のコンテキストで実行する必要があります。
したがって、それを修正するには、電話する必要がありますpad.fillRect.call(pad.ctx, 0, 0, 40, 40);
さて、これは本当にすぐに面倒で厄介になります。私が終わらせたいのは、次のことです。
pad.fillRect(0, 0, 40, 40);
私が使用したい他の継承された関数と同様に、単に機能します( eg ctx.arc
)
ここで何をすべきか本当にわかりません。「javascriptで関数呼び出しを変更する」などの行に沿って何かをグーグルで検索してみました。本当に有用な結果はありません。