Здесь я копирую и вставляю Grégory NEUT ответ - который выглядит как лучший:
Object.keys(...)
возвращает имена не перечисляемых символовсвойства объекта, но только те, которые не унаследованы.
For...in
повторяет имена несимвольных перечисляемых свойств объекта, унаследованных или нет.
Object.getOwnPropertyNames(...)
возвращает все несимвольные свойства (перечислимые или нет) .
Насколько мне известно, альтернативы for ... in
для получения унаследованных свойств
нет
function displayDetail(o) {
let keys = Object.keys(o);
console.log('Object.keys > ', keys);
let keysOwnProp = Object.getOwnPropertyNames(o);
console.log('getOwnPropertyNames > ', keysOwnProp);
const keysForIn = [];
for (let k in o) {
keysForIn.push(k);
}
console.log('for ... in > ', keysForIn);
}
/**
* The basic object
*/
const obj = {
own: 'A',
};
/**
* We add a non enumerable property to the object
*/
Object.defineProperty(obj, 'notEnumerable', {
enumerable: false,
value: 123,
});
/**
* We create a new object based on the first (it will inherit it's properties)
*/
const objWithInheritedProperties = Object.create(obj);
console.log('REGULAR OBJECT\n');
displayDetail(obj);
console.log('\n-----------\n');
console.log('OBJECT WITH INHERITANCE\n');
displayDetail(objWithInheritedProperties);