2

この投稿Objectから、 JavaScript で のプロトタイプを変更することはアンチパターンであることを理解しています。ただし、他の「組み込み」プロトタイプを変更することはアンチパターンであると広く考えられているかどうか、興味がありました。

たとえば、コンテキストの画像データを取得し、ピクセルを特定の色に設定し、画像データを元に戻すという義務を抽象化するために、setPixel(x,y,color)関数を追加したいとします。CanvasRenderingContext2D

CanvasRenderingContext2D.prototype.setPixel = function(x, y, color){
    var imgdata = this.createImageData(1,1);
    imgdata.data[0] = color.r;
    imgdata.data[1] = color.g;
    imgdata.data[2] = color.b;
    imgdata.data[3] = color.a;
    this.putImageData(imgdata,x,y);
};

私はこのコードをテストしていませんが、アイデアはわかります。「ベストプラクティス」に対してこのようなものはありますか?

4

6 に答える 6

5

何がどこに実装されているかを追跡するのが難しくなるので、私はそれをしません。また、2 人のユーザーが同じ動作をオーバーライドするリスクも生じます。

于 2009-11-04T20:29:12.923 に答える
3

一般に、JavaScript の基本オブジェクトの 1 つにプロトタイプを追加する場合は、正当な理由が必要であり、最終結果がどうなるかを予測する方法がわからないため、オブジェクトを変更する理由は実際にはありません。その修正。

たとえば、Firefox には存在するが IE には存在しない関数 (フィルター関数など) を配列に追加するのと同じように、これらはヘルパー関数であるため、私は String に startsWith、trim およびその他の関数を追加する傾向があります。

したがって、Canvas への追加は問題ありませんが、誰かがあなたのライブラリを使用していて、excanvas を使用している場合はどうでしょうか。それは問題を引き起こしますか?

それを調査するか、excanvas では機能しないことを文書化したい場合があります。それを示す小さなテストがある場合は、それを含めてください。後で新しいバージョンがあり、問題が消えた場合に人々ができるようにします。それを確認する。

更新: これを行う必要があります:

if (!CanvasRenderingContext2D.setPixel) {
...
}

そうすれば、誰かがその名前でインクルードした場合、それを上書きすることはありませんが、適切に処理する必要があります。

于 2009-11-04T20:30:57.937 に答える
1

絶対にありません; メソッドがこのようにオブジェクトに関連付けられている場合、それは洗練されたソリューションです。

于 2009-11-04T20:29:20.777 に答える
1

これらの「アンチパターン」の提案はすべて、やみくもに採用されるべきではありません。彼らが何と言おうと、最善の答えは、物事を機能させるために慣習に反して、弾丸をかむことです。もちろん、これはシナリオに大きく依存します。

単純な GO TO がうまく機能し、実装に数分しかかからなかったときに、「正しい方法」で適切な修正を行うためにコードを再編成するのに何日も費やした状況を思い出します。結局、変更する必要のないコードが変更されたため、多数のバグが作成されました。私は GO TO ステートメントのファンですか? なんてこった!しかし、1 つを使用することで 1 か月分の頭痛が防げるのであれば、疑いの余地はありません。

于 2009-11-04T20:38:19.700 に答える
0

機能や命名が既存のものを上書きしない限り、問題はないと思います。string関数のプロトタイプを変更するものを知っていTrimます。

http://www.somacon.com/p355.php

面白いことに、C# には、同じことを効果的に行う拡張メソッドと呼ばれるものがあります。

于 2009-11-04T20:25:04.617 に答える
0

それ自体ではありませんが、Ajax ライブラリの作成者は、組み込みの型とそのプロパティに依存できない場合、問題が発生する可能性があります。そのため、特定の動作に依存するコードを壊すことができます。

于 2009-11-04T20:35:10.820 に答える