2016-05-16 3 views
0

JavaScript組み込みオブジェクトで定義されている関数が多数あります。例えばStringslice()split()Arrayjoin()を持っており、彼らはその後、すべての配列のように、しかしjoin()方法JavaScriptの組み込みオブジェクトのメソッドのコピーを常に保持する必要がありますか?

を失うことになる、単に

Array.prototype.join = 'test'を使用して(それが悪い習慣ですが)無効にすることができますがありますオープンソースプロジェクトの開発者は、プロトタイプへのこの潜在的な変化をどのように見なければなりませんか?これらの機能を多かれ少なかれ使用していくらかの機能を実現する可能性が非常に高いため、問題になります。

jQueryのでは、それは、これらの方法のいくつかのコピーを保持します:

しかし、唯一の方法のいくつかは、あなたがjQueryののソースコードを読めばあなたには、いくつかに気づくでしょう、安全に保管されている

StringメソッドはStringオブジェクトで直接呼び出されます。

もちろん、ビルトインJavaScriptオブジェクトのすべてのメソッドのコピーを保持することはできますが、それは面倒です。実際、実行タイミングの問題にもなります。プロトタイプが変更される前にプログラムが実行されていれば問題ありません。しかし、逆の場合は失敗します。だから私は、jQueryや他のライブラリが何らかのメソッドのコピーを保持することを決めるとき、その決定の背後にある彼らの哲学は何かを知ることにもっと興味がありますか?

ありがとうございます。

+0

[なぜネイティブオブジェクトを拡張するのが悪いのですか?](http://stackoverflow.com/questions/14034180/why-is-extending-native-objects-a-bad-practice) – CBroe

+0

なぜあなたはそのようなプロトタイプを妨害する必要がある。他にもいくつかの方法があります。このように設定する前にチェックをする方が良いとは限りません。 – Jai

+0

私が協力していたプログラマーに冗談を言いたいのであれば、元のプロトタイプを上書きするだけです。 – Nonemoticoner

答えて

2

オープンソースプロジェクトの開発者として、最も安全かつ最良のことは、組み込みのプロトタイプが凍結されているように見せかけることです。それらを拡張または変更する慣行は、解決策よりもはるかに多くの問題の原因となります。

カスタムjoin関数が必要な場合は、最初の引数として文字列を取るように関数を作成してください。

function join(string, separator) { 
    // ... 
} 

これは、クリーンなプロトタイプを維持し、上書きされたメソッドへの参照を気にすることからあなたを停止します。

jQueryの例には、エイリアシングがあります。これらのメソッドは、より使いやすくするために変数に割り当てられています。

jQueryが別のスクリプトを読み込んで、すでに組み込みのプロトタイプを修正して元の参照が失われてしまう可能性があるため、防御する方法はありません。

+0

意味があります。追加の情報を追加するだけで、最初は混乱しているかもしれません(少なくとも混乱しました)。 'a.concat(b、c)'を呼び出すことは 'concat.call(a、b、c)'よりも簡単です。 ?しかし、私はjQueryでソースコードを研究しましたが、通常は 'concat.apply(a、arrayOfValues) 'を呼び出さなければならないときに' concat'や他のメソッドを使用します。エイリアスがなければ、 'Arrray.prototype.concat.apply(a、arrrayOfValues)'の長い文になります。 –

関連する問題