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のかわりに使うことが考えられる。