У меня есть такой объект:
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]. Как мне это сделать?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это сложно, но поскольку вы делаете это на 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?), она просто предназначена для того, чтобы дать вам отправную точку.