素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

WebKitにObject.getOwnPropertyNamesが入った

ES5のObject.getOwnPropertyNamesが入った。これは何をするメソッドかと言うと、enumerableでないプロパティを含めて全てのプロパティを列挙する物である。
つまり、

alert(Object.getOwnPropertyNames(Array.prototype).join("\n"));
/*
length,constructor,push,join,unshift,reduceRight,…
*/

のように使う。
Ownという名前がついていることから分かる通り、hasOwnProperty(name)がtrueになるものしか列挙されない。よって、プロトタイプチェーンを辿って全てのプロパティを列挙したい場合、下記のようなメソッドを使うと良い。

function getAllProperties(object) {
  var result = Object.create(null);
  while (object !== null) {
    Object.getOwnPropertyNames(object).forEach(function (name) {
      result[name] = null;
    });
    object = Object.getPrototypeOf(object);
  }
  return Object.keys(result);
}

alert(getAllProperties([]));
/*
length,constructor,push,join,unshift,forEach,reduceRight,...,isPrototypeOf,__defineGetter__,...

ところで現在の実装では__proto__など一部のプロパティは列挙されないようだが、これには何か理由があるのだろうか。
具体的にどのような場面で使えるのかというと、例えば、WebInspectorのConsoleなどでプロパティ名の補完でObject.keysのかわりに使うことが考えられる。