2

組み込みオブジェクト(私の場合はCanvasRenderingContext2Dタイプ)に機能(新しいメソッド)を追加しようとしています。

最初のアプローチは、プロトタイプにメソッドを追加することでした。それは機能しますが、組み込みオブジェクトを変更したくないのです。

Object.create(ES5から)を使用してオブジェクトを拡張することを考えてObject.create(context, <my_method_descriptors>)いましたが、一部のブラウザーでは、拡張オブジェクトのプロパティにアクセスしたり、メソッドを呼び出したりすると失敗します。たとえば、このスニペット

var canvas = document.getElementById("mainCanvas");
var context = canvas.getContext('2d');
var exContext = Object.create(context);
try {
exContext.fillStyle = 'red';
exContext.fillRect(0, 0, 120, 120);
} catch (e) {
alert(e);
}

IE9ベータ版とSafari5では失敗しますが、Firefox4ベータ版とChrome7では成功します。

別の例:Object.create(new Date()).getDate()すべてのブラウザーで失敗します。

何かご意見は?

4

2 に答える 2

3

CanvasRenderingContext2Dオブジェクトはホストオブジェクトです。つまり、JavaScript言語の一部ではなく、環境によって提供されるオブジェクトを意味します。ホストオブジェクトには特別なルールがあります。それらは基本的に好きなことを実行でき、ネイティブJavaScriptオブジェクトのように動作する義務はありません。ほとんどのブラウザは、ホストオブジェクトをネイティブオブジェクトとほぼ同じように動作させます。IEは通常、そうではありません(IEホストオブジェクトの奇抜さの例については、この最近の質問を参照してください)。

この結果、ネイティブオブジェクトのように動作するためにホストオブジェクトに依存するべきではありません。この場合のように、彼らは義務付けられておらず、しばしば義務付けられていません。ラッパーオブジェクトを作成することをお勧めします。

ケースは異なります。Object.create(new Date()).getDate()問題は、getDate()メソッドの実装が、呼び出されたオブジェクトの内部時間プロパティに依存していることです。このプロパティは、プロトタイプチェーンに沿って継承されないため、アクセスできません。より詳細な説明については、この説明を参照してください。

于 2010-11-10T23:13:24.587 に答える
0

ここでは、オブジェクト集約を使用すると役立つ場合があります。拡張するクラスのオブジェクトを含む別のクラスを作成し、それに新しいメソッドを追加します。悲しい部分があります。すべてのメソッド呼び出しを内部オブジェクトにマップします。

これが標準だったら:(

于 2010-11-10T22:41:54.350 に答える