Summary
The Object.getOwnPropertyNames()
method returns an array of all properties (enumerable or not) found directly upon a given object.
Syntax
Object.getOwnPropertyNames(obj)
Parameters
obj
- The object whose enumerable and non-enumerable own properties are to be returned.
Description
Object.getOwnPropertyNames
returns an array whose elements are strings corresponding to the enumerable and non-enumerable properties found directly upon obj
. The ordering of the enumerable properties in the array is consistent with the ordering exposed by a {{jsxref("Statements/for...in", "for...in")}} loop (or by {{jsxref("Object.keys")}}) over the properties of the object. The ordering of the non-enumerable properties in the array, and among the enumerable properties, is not defined.
Examples
Example: Using getOwnPropertyNames
var arr = ['a', 'b', 'c']; print(Object.getOwnPropertyNames(arr).sort()); // prints '0,1,2,length' // Array-like object var obj = { 0: 'a', 1: 'b', 2: 'c' }; print(Object.getOwnPropertyNames(obj).sort()); // prints '0,1,2' // Printing property names and values using Array.forEach Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) { print(val + ' -> ' + obj[val]); }); // prints // 0 -> a // 1 -> b // 2 -> c // non-enumerable property var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; }, enumerable: false } }); my_obj.foo = 1; print(Object.getOwnPropertyNames(my_obj).sort()); // prints 'foo,getFoo'
If you want only the enumerable properties, see {{jsxref("Object.keys()")}} or use a {{jsxref("Statements/for...in", "for...in")}} loop (although note that this will return enumerable properties not found directly upon that object but also along the prototype chain for the object unless the latter is filtered with {{jsxref("Object.prototype.hasOwnProperty()", "hasOwnProperty()")}}).
Items on the prototype chain are not listed:
function ParentClass() {} ParentClass.prototype.inheritedMethod = function() {}; function ChildClass() { this.prop = 5; this.method = function() {}; } ChildClass.prototype = new ParentClass; ChildClass.prototype.prototypeMethod = function() {}; alert( Object.getOwnPropertyNames( new ChildClass() // ['prop', 'method'] ) );
Example: Get Non-Enumerable Only
This uses the {{jsxref("Array.prototype.filter()")}} function to remove the enumerable keys (obtained with {{jsxref("Object.keys()")}}) from a list of all keys (obtained with Object.getOwnPropertyNames
) leaving only the non-enumerable keys.
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) { // not found in enum_only keys mean the key is non-enumerable, // so return true so we keep this in the filter return true; } else { return false; } }); console.log(nonenum_only);
Notes
In ES5, if the argument to this method is not an object (a primitive), then it will cause a {{jsxref("Global_Objects/TypeError", "TypeError")}}. In ES6, a non-object argument will be coerced to an object.
> Object.getOwnPropertyNames("foo") TypeError: "foo" is not an object // ES5 code > Object.getOwnPropertyNames("foo") ["length", "0", "1", "2"] // ES6 code
Specifications
Specification | Status | Comment |
---|---|---|
{{SpecName('ES5.1', '#sec-15.2.3.4', 'Object.getOwnPropertyNames')}} | {{Spec2('ES5.1')}} | Initial definition. Implemented in JavaScript 1.8.5. |
{{SpecName('ES6', '#sec-object.getownpropertynames', 'Object.getOwnPropertyNames')}} | {{Spec2('ES6')}} |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | {{CompatChrome("5")}} | {{CompatGeckoDesktop("2")}} | {{CompatIE("9")}} | {{CompatOpera("12")}} | {{CompatSafari("5")}} |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} | {{CompatUnknown}} |
Based on Kangax's compat table.
SpiderMonkey-specific notes
Prior to SpiderMonkey 28 {{geckoRelease("28")}}, Object.getOwnPropertyNames
did not see unresolved properties of {{jsxref("Error")}} objects. This has been fixed in later versions ({{bug("724768")}}).
See also
- Enumerability and ownership of properties
- {{jsxref("Object.prototype.hasOwnProperty()")}}
- {{jsxref("Object.prototype.propertyIsEnumerable()")}}
- {{jsxref("Object.create()")}}
- {{jsxref("Object.keys()")}}
- {{jsxref("Array.forEach()")}}