2011-06-03 12 views

答えて

17

問題は、プロトタイプがいくつかの場所で変更できることです。例えば、あるライブラリは、Arrayメソッドのプロトタイプにmapメソッドを追加し、あなた自身のコードは同じものを追加しますが、別の目的で追加します。したがって、1つの実装が壊れてしまいます。

+1

同様の名前空間の衝突も(jQueryの自体に猿パッチある)のjQueryプラグインで発生/ q/5740974/479863 –

+0

これに関して、私は複数のライブラリを使い、コード内で何が起こっているのかわからないと、開発者の責任だと感じていますが、それは私の質問に答えるものです。 – colourandcode

+7

開発者は、JQueryやDoJoのような大規模なライブラリの内部構造と実装を知ることができますか?彼らがフレームワークの次のリリースの前に実装されたものを手に入れるかどうかは疑いがあります。ライブラリとフレームワークの全体のポイントは、それらを使用する方法だけを知る必要があることです。 –

6

bjorndが指摘したように、monkey-patchingは、複数のライブラリが関わっている場合にのみ問題があります。したがって、再利用可能なライブラリを作成している場合は、それを行うのは良い方法ではありません。しかし、javascriptでホストオブジェクトを使用するときにブラウザ間の互換性の問題を解消するための最善の手法はまだ残っています。

prototype.jsとjson2.jsを一緒に使用した場合の実際の事故については、this linkを参照してください。

10

ほとんどの場合、名前空間の衝突が原因です。 Prototypeフレームワークはネイティブに含まれているものとは異なる名前を保持することに多くの問題を抱えていたことは知っています。

オブジェクトのプロトタイプに関数を追加する二つの主要な人々にユーティリティを提供する方法..

プロトタイピング

があります。 MooToolsとPrototypeはこれを行います。

利点:

  1. スーパー簡単にアクセスできます。

短所:

  1. は、システムメモリを大量に使用することができます。最新のブラウザはコンストラクタからプロパティのインスタンスをフェッチするだけですが、一部の古いブラウザでは、コンストラクタの各インスタンスごとにそれぞれのプロパティのインスタンスが個別に格納されます。
  2. 常に利用可能なわけではありません。私は「利用できない」の意味は何

はこれです:

あなたはdocument.getElementsByTagNameからのNodeListを持っており、あなたがそれらを反復処理したい想像してみてください。あなたはできません..

..それはノードリストであり、配列ではありません。上記はあなたのようなエラーを与えるでしょう:Uncaught TypeError: [object NodeList] doesn't have method 'map'

NodeListや他のArray型の オブジェクトを実際の配列に変換する方法は非常に簡単です。

それにユーティリティを重ねブランドの新しいグローバル変数と在庫を作成

を収集します。 jQueryとDojoはこれを行います。

利点:常に存在

  1. メモリ使用量が少ない。

短所:

  1. ほどうまく配置されていません。
  2. 時には使いにくいと感じることがあります。それでも..あなたが行うことができ..but

    document.getElementsByTagName('p').map(function() { ... }); 
    

    を行うことができませんでした。この方法では

..

通常では、マットで指摘したように..but
jQuery.map(document.getElementsByTagName('p'), function() { ... }); 

あなたは上記で行うでしょう。

jQuery('p').map(function() { ... }); 

どちらが良いですか?

最終的には、あなた次第です。上書きされる危険性はありますが、上書きすることをお勧めします。それは私が好むスタイルなので、リスクが結果に値すると感じています。あなたが私としてそれについて確信していないなら、収集も良いスタイルです。彼らには長所と短所がありますが、すべてがすべて同じ結果を生み出します。

+1

@tylerwashburn:*関数のインスタンス/文字列/すべてのシングルインスタンス上の何でも。*本当ですか? Afaikはプロトタイプにsometingを追加することで、コンストラクターに* once *を追加します。インスタンスはその後、コンストラクタプロトタイプから情報を取得します。 – KooiInc

+0

あなたが言及している 'map'の例ではなく、map(function(){...}'を_can_ do '$( 'p')してください。 –

+0

@KooiInc私はそれが本当であるかどうかは完全には分かりませんが、 – Kayla

1

Nicholas C. Zakasの優れた記事には、なぜこの練習がチームや顧客プロジェクト中にプログラマーの心の中にあるべきものではないのかが説明されています(教育目的のためにいくつかの調整ができます一般的なプロジェクトの使用)。

保守性のJavaScript:あなたが所有していないオブジェクトを変更しないでください:http://stackoverflow.com: https://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects-you-down-own/

関連する問題