2011/03/02

列挙(Object.keysとObject.getOwnPropertyNames)

一般的な方法
forループの中でhasOwnProperty
オブジェクトのプロパティを列挙するときに一番良く使うのがこの方法だと思います。


var exec = function() {
// 何かの処理
}

for (var e in obj) {
    obj.hasOwnProperty(e) && exec();
}

これでも全然オッケーと思いますが、実はObject.keysという便利なものがあります。
これを使えば処理がスッキリかける!


Object.keysを使った方法
var hoge = {one:"hoge", two:"moge", three:"fuga"};
// オブジェクトがあれば、exec関数を実行する。
Object.keys(hoge) && exec();

もし、Object.keysが実装されていないブラウザがあれば以下のような関数を
定義しとくと良いです。

if (!typeof Object.keys) {

 Object.key = function(obj) {
  var prop,
     keys = [];
  if (typeof obj != "object" && typeof obj != "function") {
   // 例外処理する。例えば、TypeErrorを投げる。
   throw TypeError("引数にはオブジェクトを渡してください");
  }
  for (prop in obj) {
   obj.hasOwnProperty(prop) && keys.push(prop);
  }
  return keys;
 }
}



Object.getOwnPropertyNamesを使った方法
Object.keysと似ていますが、Object.getOwnPropertyNameを使うと
コンストラクタを引数にすることもできます。

var hoge = {one:"hoge", two:"moge", three:"fuga"};
// オブジェクトがあれば、exec関数を実行する。
Object.getOwnPropertyNames(hoge) && exec();



// オブジェクトがあれば、exec関数を実行する。
Object.getOwnPropertyNames(String) && exec();
Object.getOwnPropertyNames(Math) && exec();



ちなみに・・・仕様はここにあります。
http://ecma262-5.com/ELS5_HTML.htm#Section_15.2.3.4

これらは新しいJavaScriptの仕様なので
今後活用する場面も増えてくるのではないでしょうか。