NodeJS: объект util.inspect с функцией внутри

У меня есть такой объект:

  const foo = {
    bar: "bar value",

    baz() {
      console.info(this.bar);
    },
  };

Я хочу записать этот объект в отдельный файл js, используя fs.writeFileSync и util.inspect

например

fs.writeFileSync("newfile.js", "exports.config = " + 
util.inspect(foo, { showHidden: false, compact: false, depth: null }));

Что дает мне файл newfile.js со следующим содержимым:

exports.config = {
  bar: 'bar value',
  baz: [Function: baz]
}

Мне нужно, чтобы функция baz отображалась так, как она была представлена ​​в исходном объекте foo, а не отображалась как [Function: baz]. Как мне это сделать?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
912
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это сложно, но поскольку вы делаете это на Node.js, вам не нужно беспокоиться о капризах различных движков JavaScript, и это хорошо.

Вам нужно будет использовать недавно стандартизированный Function.prototype.toString. Ваш baz является метод, поэтому toString возвращает для него определение метода, но другие функции могут появляться в виде объявлений функций, выражений функций, стрелочных функций и т. д.

Это должно помочь вам начать:

const strs = [];
for (const [name, value] of Object.entries(foo)) {
    if (typeof value === "function") {
        const fstr = value.toString().trim();
        if (fstr.startsWith("function") || fstr[0] === "(") {
            strs.push(`${name}: ${fstr}`);
        } else {
            strs.push(fstr); // probably a method
        }
    } else {
        strs.push(`${name}: ${JSON.stringify(value)}`);
    }
}
const sep = "\n    ";
const str = `exports.config = {${sep}${strs.join(`,${sep}`)}\n};`;

Живой пример (если вы не используете браузер с V8 , например Chrome, Chromium, Brave , это может не сработать):

const foo = {
    bar: "bar value",

    biz: function() {
        // This is a function assigned to a property
        return this.bar;
    },
    
    buz: function() {
        // This is an arrow function assigned to a property
        // VERY surprising that this comes out as a traditional function
        return this.bar.toUpperCase();
    },
    
    baz() {
        // This is a method
        console.info(this.bar);
    },
};
const strs = [];
for (const [name, value] of Object.entries(foo)) {
    if (typeof value === "function") {
        const fstr = value.toString().trim();
        if (fstr.startsWith("function") || fstr[0] === "(") {
            strs.push(`${name}: ${fstr}`);
        } else {
            strs.push(fstr); // probably a method
        }
    } else {
        strs.push(`${name}: ${JSON.stringify(value)}`);
    }
}
const sep = "\n    ";
const str = `exports.config = {${sep}${strs.join(`,${sep}`)}\n};`;
console.info(str);
.as-console-wrapper {
  max-height: 100% !important;
}

Очевидно, что здесь есть много возможностей для улучшения (например, что, если в объекте есть функция, назначенная одному из свойств foo?), она просто предназначена для того, чтобы дать вам отправную точку.

Другие вопросы по теме