Object.getOwnPropertyNames() メソッドは、与えられたオブジェクトで発見されたすべての直接のプロパティを含む配列を (シンボルを使用したものを除き、列挙不可能なプロパティを含んで) 返します。
構文
Object.getOwnPropertyNames(obj)
引数
obj- オブジェクトで、これ自身の列挙可能および列挙不可能なプロパティが返されます。
返値
指定されたオブジェクトで発見された、列挙可能および列挙不可能なプロパティに対応する文字列を要素とする配列。
解説
Object.getOwnPropertyNames() は、 obj で発見された列挙可能および列挙不可能なプロパティに対応する文字列を要素とする配列を返します。配列内における列挙可能なプロパティの順序は、オブジェクトで for...in (または Object.keys()) を実行して見つかるものの順序と同じです。配列内における列挙不可能なプロパティの順序および列挙可能なプロパティと間の順序は未定義です。
例
Object.getOwnPropertyNames() の使用
var arr = ['a', 'b', 'c'];
console.log(Object.getOwnPropertyNames(arr).sort());
// ["0", "1", "2", "length"] と出力されます
// Array-like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.getOwnPropertyNames(obj).sort());
// ["0", "1", "2"] と出力されます
// Array.forEach を使ったプロパティと値の出力
Object.getOwnPropertyNames(obj).forEach(
function (val, idx, array) {
console.log(val + ' -> ' + obj[val]);
}
);
// 出力結果
// 0 -> a
// 1 -> b
// 2 -> c
// 列挙不可能なプロパティ
var my_obj = Object.create({}, {
getFoo: {
value: function() { return this.foo; },
enumerable: false
}
});
my_obj.foo = 1;
console.log(Object.getOwnPropertyNames(my_obj).sort());
// ["foo", "getFoo"] と出力されます
列挙可能なプロパティのみ取得したい場合は Object.keys() を参照するか、 for...in ループを用いるかしてください。 (なお、 for...in ループでは hasOwnProperty() でフィルタリングされない限りは、そのオブジェクト上で直接見つかるプロパティだけでなく、プロトタイプチェーン上の列挙可能なプロパティも返されることに注意してください。)
プロトタイプチェーン上のプロパティは配列に含まれません。
function ParentClass() {}
ParentClass.prototype.inheritedMethod = function() {};
function ChildClass() {
this.prop = 5;
this.method = function() {};
}
ChildClass.prototype = new ParentClass;
ChildClass.prototype.prototypeMethod = function() {};
console.log(
Object.getOwnPropertyNames(
new ChildClass() // ["prop", "method"]
)
);
列挙不可能なプロパティのみを取得する
ここでは Array.prototype.filter() 関数を使用して、 (Object.keys() で取得した) 列挙可能なキーを (Object.getOwnPropertyNames() で取得した) すべてのキーからフィルタリングし、出力として列挙不可能なキーのみを取得します。
var target = myObject;
var enum_and_nonenum = Object.getOwnPropertyNames(target);
var enum_only = Object.keys(target);
var nonenum_only = enum_and_nonenum.filter(function(key) {
var indexInEnum = enum_only.indexOf(key);
if (indexInEnum == -1) {
// このキーが enum_only の中になければ、
// そのキーは列挙不可能であることを意味するので、
// true を返してフィルターの中に残します。
return true;
} else {
return false;
}
});
console.log(nonenum_only);
メモ
ES5 では、このメソッドの引数がオブジェクトではない値 (プリミティブ値) である場合、TypeError が発生します。ES6 では、非オブジェクト値はオブジェクトに強制変換されます。
Object.getOwnPropertyNames('foo');
// TypeError: "foo" is not an object (ES5 のコード)
Object.getOwnPropertyNames('foo');
// ["0", "1", "2", "length"] (ES2015 のコード)
仕様書
| 仕様書 | 状態 | 備考 |
|---|---|---|
| ECMAScript Latest Draft (ECMA-262) Object.getOwnPropertyNames の定義 |
ドラフト | |
| ECMAScript 2015 (6th Edition, ECMA-262) Object.getOwnPropertyNames の定義 |
標準 | |
| ECMAScript 5.1 (ECMA-262) Object.getOwnPropertyNames の定義 |
標準 | 初回定義。 JavaScript 1.8.5 で実装。 |
ブラウザーの対応
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
getOwnPropertyNames | Chrome 完全対応 5 | Edge 完全対応 12 | Firefox 完全対応 4 | IE 完全対応 9 | Opera 完全対応 12 | Safari 完全対応 5 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 12 | Safari iOS 完全対応 5 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応
Firefox 固有の注意事項
Firefox 28 より古いバージョンでは、Object.getOwnPropertyNames は Error オブジェクトの unresolved プロパティが取得できません。これは以降のバージョンでは修正されています。 (バグ 724768).