2015-05-05 3 views
3

Есть много старых вопросов о сбросе объектов JavaScript.Дамп JavaScript-объект, включающий в себя функциональные тела как «достаточно хороший» код для форматирования

Но те, которые указывают на сброс содержимого функций, я могу найти только те, которые испускают эти функции в виде строк в кавычках (с закрытыми внутренними кавычками).

То, что я хочу является то, что сбрасывает объекты, в том числе функций, в полной мере, в простом старом формате JavaScript готов быть довольно напечатанной.

  • Я не нужна полные сериализации и десериализации как некоторые предыдущие вопросы.
  • I do необходимо посмотреть объект как текст. Просто использование console.log() требует взаимодействия для разворачивания элементов объекта и т. Д. Сохранение буфера консоли как текста после console.log() не приводит к синтаксису простого js, который может быть довольно печатным.
  • Выделите заполнители или такие ссылки для ссылок, которые не могут быть сброшены (круговые ссылки, DOM-ссылки и т. Д.). Должно быть не просто barf, когда он попадает на него.

Вот the naive approach, которая сбрасывает функцию текста, но в кавычках, что довольно принтер не будет форматировать как код:

JSON.stringify(someObject, function(key, val) { 
    return (typeof val === 'function') ? val.toString() : val; 
}, 4); 

Для тестового объекта {a: 1, b: 'bb', c: "bb", f: function e() {return "x";} } наивные подход выходов:

{ 
    "a": 1, 
    "b": "bb", 
    "c": "bb", 
    "f": "function e() {return \"x\";}" 
} 

Что мне нужно:

{ 
    "a": 1, 
    "b": "bb", 
    "c": "bb", 
    "f": function e() { 
     return "x"; 
    } 
} 

Я доволен, что это будет закрыто как дубликат, если один из предыдущих ответов сделает то, что я хочу. Я смотрел на многих из них и не мог найти его.

(Use case: Создание регистрационного имени TaperMonkey для стороннего сайта. Мне нужно посмотреть, что на самом деле доступно для поиска мест для добавления пользовательских перехватов. Я буду украшать выходные данные, распечатывать их, загружать в редактор кода , и т. д.)

+1

Я должен что-то недоразумение. Не работает ли ваш подход? –

+0

Нет. Он выводит цитируемые функции, поэтому красивый принтер просто видит строки и не переформатирует их. Я собираюсь добавить образец вывода к моему вопросу. – hippietrail

+0

Почему вы передаете строку в 'JSON.stringify'? Разве это не значит, что ваши цитаты ускользают? – Mathletics

ответ

3

Не использовать JSON.stringifiy - JSON не может представлять функции, и поэтому вы никогда не получите его, чтобы вернуть то, что хотите.

Поскольку вы ориентируетесь только на определенный браузер, возможно, вы можете использовать uneval или .toSource. Если вы не используете Firefox, посмотрите на this polyfill.

+0

Точно. JSON - это не то же самое, что «обозначение JavaScript». У этого есть значительно больше ограничений. – tadman

+0

На моем увязшем маленьком нетбуке на моем отрывочном соединении из Вьетнама я сейчас изучаю это и есть ли эквиваленты для Chrome. – hippietrail

+0

@hippietrail: О, как-то я был под выражением того, что вы используете Firefox-скрипты. – Bergi

1

Вы можете выполнить это с помощью простой замены строки.

var obj = { 
 
    name: 'Bond', 
 
    getName: function() { 
 
     return 'James ' + this.name; 
 
    }, 
 
    getDrink: function() { 
 
     return "Martini"; 
 
    } 
 
}; 
 
var result = JSON.stringify(obj, function(key, val) { 
 
    return (typeof val === 'function') ? val.toString() : val; 
 
}, 4); 
 
result = result 
 
    .replace(/"function/g, 'function') 
 
    .replace(/}"/g, '}') 
 
    .replace(/\\n/g, '\n') 
 
    .replace(/\\"/g, '"'); 
 
document.querySelector('pre').innerText = result; 
 

 
// Or if you actually want it as an object 
 
eval('var obj = ' + result); 
 
console.log(obj);
<pre></pre>

+3

Это действительно последняя техника, так как это регулярное выражение будет любезно калечить что-либо в ваших данных JSON, которое выглядит нечетко как функция. – tadman

+0

Это правда, но я считаю, что последняя курортная техника в порядке, в крайнем случае, проблема. –

+1

Я думал о постобработке, но уже беспокоился о том, что он может неправильно обрабатывать некоторые вещи. На моем объекте реального мира после довольно печатной печати отступ работает, но это может быть связано с quirk в jsbeautify, а не с фактическими проблемами, вызванными регулярным выражением. На данный момент похоже, что этот подход подходит для моей текущей проблемы. – hippietrail