1. ホーム
  2. javascript

[解決済み] JavaScriptオブジェクトのプロパティを列挙するにはどうすればよいですか?[重複しています]。

2022-03-14 09:49:41

質問

JavaScriptオブジェクトのプロパティを列挙するにはどうしたらよいですか?

本当は、定義されたすべての変数とその値をリストアップしたいのですが、変数を定義すると、実際にはウィンドウ・オブジェクトのプロパティが作成されることを知りました。

どのように解決するのですか?

簡単なことです。

for(var propertyName in myObject) {
   // propertyName is what you want
   // you can get the value like this: myObject[propertyName]
}

さて、この方法ではプライベート変数を取得することはできません。


EDIT ビットワイズプラティパス を使用しない限りは、その通りです。 hasOwnProperty() しかし、オブジェクト指向プログラミングに慣れた人が、なぜそうでないことを期待するのか、私にはわかりません。通常、この問題を持ち出す人は、Douglas Crockfordの警告を受けたことがあるのですが、それでも少し混乱します。繰り返しになりますが、継承はオブジェクト指向言語では当たり前のことで、プロトタイプであるにもかかわらず、JavaScriptの一部でもあります。

さて、そうは言っても hasOwnProperty() はフィルタリングに便利ですが、継承されたプロパティを取得することに何か危険性があるかのような警告を鳴らす必要はありません。

EDIT 2: ビットワイズプラティパス には、オブジェクトを最初に書いた時点(プロトタイプ経由)よりも後の時点で、誰かがオブジェクトにプロパティやメソッドを追加した場合に発生する状況が示されていますが、これは確かに予期せぬ動作を引き起こすかもしれませんが、私個人はそれを完全に私の問題だとは思っていません。あくまで意見の相違です。それに、もし私がオブジェクトの構築時にプロトタイプを使いながら、オブジェクトのプロパティを反復するようなコードを設計していて、すべての継承されたプロパティが欲しいとしたらどうでしょう?その場合、私は hasOwnProperty() . そして、後から誰かが新しいプロパティを追加したとする。その時点で挙動がおかしくなるのは、私のせいでしょうか?私はそうは思わない。そのため、jQueryの例では、動作方法を拡張する方法を指定しているのだと思う(たとえば jQuery.extendjQuery.fn.extend ).