Получение всех свойств объекта в JavaScript

#javascript #node.js #ecmascript-5

#javascript #node.js #ecmascript-5

Вопрос:

Есть ли в JavaScript способ получить все свойства объекта, включая встроенные? for... in пропускает встроенные свойства, что обычно является тем, что вам нужно, но не в этом случае. Я использую Node.js если это имеет значение, и это для целей отладки, поэтому оно не обязательно должно быть элегантным, быстрым или портативным.

Ответ №1:

Да, это так, просто пройдите через прототип и получите все свойства

 function getAllProperties(o) {
    var properties = [];
    while (o) {
        [].push.apply(properties, Object.getOwnPropertyNames(o))
        o = Object.getPrototypeOf(o);
    }
    //remove duplicate properties
    properties = properties.filter(function(value, index) {
        return properties.indexOf(value) == index;
    })
    return properties;
}
 

Комментарии:

1. Какова цель шага фильтрации?

2. Некоторые свойства могут повторяться, например, toString или constructor, поэтому этап фильтрации удаляет дубликаты

3. Да, но getOwnPropertyNames() должно охватывать это, верно?

4. Нет, getOwnPropertyNames возвращает только массив «прямых» свойств объекта, а не его прототипа ( Object.getOwnPropertyNames([]) просто возвращает ['length'] ). Итак, чтобы получить все свойства объекта, мы должны пройти цепочку прототипов и получить их свойства. И по пути некоторые свойства переопределяются, например, toString для Array s

5. Согласен. Но у вас уже есть код для продвижения по цепочке прототипов.

Ответ №2:

Ну, для отладки вы могли бы использовать это:

 console.log(yourObject);
 

Просто и быстро. Как в узле, так и в браузере. : )