要約:
わかりました、この質問をしてからしばらく経ちました。いつものように、Object.prototype
こことウェブ上の他の場所の両方で、それに対するすべての有効な議論にもかかわらず、とにかく行って拡張しました. 私はそのような頑固なジャークだと思います。
私は、新しいメソッドが予想される動作を台無しにすることを防ぐ決定的な方法を考え出そうとしましたが、これは非常に困難であることが判明しましたが、有益なことです。
JavaScript について非常に多くのことを学びました。少なくとも、ネイティブ プロトタイプをいじるほど無作法なことを試みるつもりはありません ( String.prototype.trim
IE < 9 を除く)。
この特定のケースでは、ライブラリを使用していないため、競合は私の主な関心事ではありませんでした。しかし、ネイティブ プロトタイプをいじる際に発生する可能性のある事故をもう少し深く掘り下げたので、このコードをライブラリと組み合わせて試すことはおそらくないでしょう。
このプロトタイプ アプローチを調べることで、モデル自体の理解が深まりました。私はプロトタイプを柔軟な伝統的な抽象クラスの何らかの形として扱っていたため、伝統的な OOP の考え方にしがみついていました。この観点は、実際にはプロトタイプ モデルを正当化するものではありません。Douglas Crockford がこの落とし穴について書いていますが、悲しいことに、ピンク色の背景のために記事全体を読むことができませんでした。
これを読んだ人が自分の目で確かめたいと思う機会がないので、この質問を更新することにしました。私が言えることは、ぜひともそうしてくださいということだけです。このかなりばかげた考えを放棄することを決定する前に、私がしたように、いくつかのきちんとしたことを学んでいただければ幸いです。特にこの場合は、単純な関数でも同様に、またはそれ以上に機能する可能性があります。結局のところ、その真の美しさは、わずか 3 行のコードを追加するだけで、まったく同じ関数を使用して、特定のオブジェクトのプロトタイプをまったく同じように拡張できることです。
かなり前から出回っている質問をしようとしていることはわかっていますが、なぜ Object.prototype は立ち入り禁止と見なされるのですか? それはそこにあり、他のプロトタイプと同じように、まったく同じように拡張できます. では、これを利用しない手はありません。私の考えでは、自分が何をしているのかを理解している限り、Object プロトタイプを避ける理由はありません。
たとえば、次の方法を使用します。
if (!Object.prototype.getProperties)
{
Object.prototype.getProperties = function(f)
{
"use strict";
var i,ret;
f = f || false;
ret = [];
for (i in this)
{
if (this.hasOwnProperty(i))
{
if (f === false && typeof this[i] === 'function')
{
continue;
}
ret.push(i);
}
}
return ret;
};
}
基本的に、これfor...in
は、関数内で安全に保つか、何度も何度も書く同じ古いループです。私はそれがすべてのオブジェクトに追加されることを知っています.JavaScriptのほぼすべての継承チェーンはObject.prototype
.
おそらく、誰かが私がどこで間違っているかを私に伝えるのに、このチャップよりも優れた仕事をしてくれるでしょう。人々が のプロトタイプに触れてはならない
理由を探しているうちに、1 つのことが明らかになりました。それはループを壊しますが、繰り返しになりますが、多くのフレームワークもそうです。独自の継承チェーンは言うまでもありません。したがって、オブジェクトのプロパティをループするときにチェックを含めないのは悪い習慣だと思います。Object
for..in
.hasOwnProperty
これもかなり興味深いと思いました。繰り返しますが、1 つのコメントは非常に明白です: ネイティブ プロトタイプを拡張することは悪い習慣ですが、V8 の人々がそれを行う場合、彼らが間違っていると誰が言えますか?
私は知っています、その議論はまったく積み重なっていません。
ポイントは、上記のコードに問題があるとは本当に思えないということです。私はそれが好きで、たくさん使っていますが、これまで一度もがっかりしたことはありません. Object プロトタイプにさらにいくつかの関数を追加することも考えています。誰かが私がすべきでない理由を教えてくれない限り、それはそうです。