JavaScript

Object.getOwnPropertyNames()メソッド

 編集:2022.07.28 by T.A.

与えられたオブジェクトで発見されたすべての直接のプロパティを含む配列を(シンボルを使用したものを除き、列挙不可能なプロパティを含んで)返します。

Object.getOwnPropertyNames(obj)
obj オブジェクトで、これ自身の列挙可能および列挙不可能なプロパティが返されます。
戻り値

指定されたオブジェクトで発見された、列挙可能および列挙不可能なプロパティに対応する文字列を要素とする配列。

解説

Object.getOwnPropertyNames() は、obj で発見された列挙可能および列挙不可能なプロパティに対応する文字列を要素とする配列を返します。配列内における列挙可能なプロパティの順序は、オブジェクトで for...in(または Object.keys())を実行して見つかるものの順序と同じです。ES6 によれば、オブジェクトの整数のキーは(列挙可能であっても列挙不可能であっても)最初の配列に昇順で追加され、その後に挿入順を表す文字列キーが続きます。

ES5 では、このメソッドの引数がオブジェクトではない(プリミティブである)場合、TypeError が発生します。ES2015 では、引数がオブジェクトではない場合はオブジェクトに型変換されます。

Object.getOwnPropertyNames('foo');
// TypeError: "foo" is not an object (ES5 code)

Object.getOwnPropertyNames('foo');
// ["0", "1", "2", "length"]  (ES2015 code)
Object.getOwnPropertyNames() の使用
var arr = ['a', 'b', 'c'];
D=Object.getOwnPropertyNames(arr).sort());	//=["0", "1", "2", "length"]。.sort() は配列のメソッド
// 配列風オブジェクト
var obj = { 0: 'a', 1: 'b', 2: 'c' };
D=Object.getOwnPropertyNames(obj).sort();	//=["0", "1", "2"]。.sort() は配列のメソッド
// Array.forEach を使ったプロパティと値の出力
Object.getOwnPropertyNames(obj).forEach(
  function (val, idx, array) {
    alert(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;
D=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() {};
D=Object.getOwnPropertyNames(new ChildClass());	//=["prop", "method"]

¶省く


テスト