ハッシュのキーを見つけるには?

javascriptでは、オブジェクトがハッシュとして倍増することは知っていますが、キーを取得する組み込み関数を見つけることができませんでした。

var h = {a:'b',c:'d'};

以下のようなものが必要です。

var k = h.keys() ; // k = ['a','c'];

自分で関数を書いて、アイテムを繰り返し処理し、キーを配列に追加して返すのは簡単ですが、標準的でよりきれいな方法はありますか?

私が見逃しているシンプルな組み込み関数があるはずだとずっと思っているのですが、見つかりません。

クライアントブラウザとの大きな互換性を必要とするプロダクションコードには、古いブラウザでのObject.keyを確保するためにshimを使った上記のIvan Nevostruev'氏の回答をお勧めします。しかし、ECMAの新しいdefineProperty機能を使えば、要求通りの機能を実現することができます。

ECMAScript 5 - Object.definePropertyの場合

ECMA5では、Object.defineProperty()を使って、列挙できないプロパティを定義できます。現在の互換性**]2にはまだ多くの課題がありますが、最終的にはすべてのブラウザで使用できるようになるはずです。(特に現在のIE8との互換性はありません!)。

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    var keys = [];
    for(var i in this) if (this.hasOwnProperty(i)) {
      keys.push(i);
    }
    return keys;
  },
  enumerable: false
});

var o = {
    'a': 1,
    'b': 2
}

for (var k in o) {
    console.log(k, o[k])
}

console.log(o.keys())

# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]

しかし、ECMA5ではすでにObject.keysが追加されているので、これを使った方がいいでしょう。

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    return Object.keys(this);
  },
  enumerable: false
});

当初の回答

Object.prototype.keys = function ()
{
  var keys = [];
  for(var i in this) if (this.hasOwnProperty(i))
  {
    keys.push(i);
  }
  return keys;
}

**編集:***この回答は以前からあったものなので、上記はそのままにしておきます。この記事を読んだ方は、以下のIvan Nevostruevさんの回答もお読みください。

プロトタイプ関数を列挙できないようにする方法がないので、hasOwnPropertyを使わないfor-inループでは常に出てきてしまいます。Objectのプロトタイプを拡張することがこれほど面倒でなければ、この回答は理想的だと思います。

解説 (8)

私の知る限りでは、これが精一杯です...。

var keys = [];
for (var k in h)keys.push(k);
解説 (2)

for/inを使ってオブジェクトのプロパティをループさせることができると思いますので、次のようなことができます。

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}
解説 (1)