衝突を避けるためです。一般に、期待する値のプロパティを持たないオブジェクトの問題です。
JS のオブジェクトは多くの場合、キーと値のマップとして使用され、キーは任意の文字列にすることができ__defineGetter__
ますhasOwnProperty
。未知のオブジェクトでそのような関数を呼び出したい場合hasOwnProperty
(JSON が渡される可能性のある一般的な列挙関数でよく使用されるように)、上書きされたプロパティを取得したかどうかを確認することはできません (それは関数でさえない可能性があります)。 )または必要なオリジナル、またはオブジェクトがプロパティをまったく継承するかどうか。この問題 (またはこの IE のバグ) を回避するには、使用する必要がありますObject.prototype.hasOwnProperty.call
- それは醜いです。
したがって、これらすべての関数の名前空間Object
は有用であるだけであり、リフレクション メソッドをオブジェクトのアプリケーション インターフェイスから分離するクリーンな API です。これは最適化 (静的分析の簡素化) にも役立ち、サンドボックス内のリフレクション API へのアクセスをより簡単に制限できるようになります。少なくともそれが設計上のアイデアでした。
プロトタイプを試してみるのもいいかもしれませんが、defineProperty
安全に使用できるのは、既知のオブジェクトを操作する場合のみです。それでも必要な場合は(いつ使用するか、いつ使用しないかを知っているため)、使用できます
Object.defineProperty(Object.prototype, "defineProperty", {
writable: true,
enumberable: false,
value: function(prop, descr) {
return Object.defineProperty(this, prop, descr);
}
});