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 で実装。

ブラウザーの対応

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
getOwnPropertyNamesChrome 完全対応 5Edge 完全対応 12Firefox 完全対応 4IE 完全対応 9Opera 完全対応 12Safari 完全対応 5WebView Android 完全対応 ありChrome Android 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり

凡例

完全対応  
完全対応

Firefox 固有の注意事項

Firefox 28 より古いバージョンでは、Object.getOwnPropertyNamesError オブジェクトの unresolved プロパティが取得できません。これは以降のバージョンでは修正されています。 (バグ 724768).

関連情報

ドキュメントのタグと貢献者

このページの貢献者: mdnwebdocs-bot, mfuji09, woodmix, coeurl, fright801, teoli, ethertank, yyss
最終更新者: mdnwebdocs-bot,