始终将“[object Object]”作为自定义字符串格式函数的输出

时间:2017-08-05 01:52:22

标签: javascript

我正在使用直接从StackOverflow源代码复制的字符串格式函数;您现在可以使用以下代码在开发人员控制台中对其进行测试:

"Logged in as {tag}, on {guilds} guild{s}".formatUnicorn({ tag: "TAG_HERE", guilds: "GUILD_COUNT", s: "s" });

我正在尝试使用这个完全相同的功能,但总是以[object Object]作为输出。

logger.info("bot", "Logged in as {tag}, on {guilds} guild{s}".format({ tag: client.user.tag, guilds: client.guilds.size, s: client.guilds.size === 1 ? "" : "s" }));

我已经尝试require("util").inspect(...)返回的对象,但是只输出'[object Object]',基本上完全相同,但是用单引号围绕它。

这是函数,如果有帮助的话。我已经重命名了这个问题的一些变量,但是在测试代码时它是来自SO源的直接副本:

String.prototype.format = () => {
  let string = this.toString();
  if(!arguments.length)
    return string;
  let type = typeof arguments[0],
    replacements = "string" == type || "number" == type ? Array.prototype.slice.call(arguments) : arguments[0];
  for(const index in replacements)
    string = string.replace(new RegExp("\\{" + index + "\\}", "gi"), replacements[index]);
  return string;
}

这可能是一个简单的错误,只是一个简单的解决方案,但我已经工作了一段时间来尝试诊断问题/让它正常工作,但我自己找不到任何解决方法。

2 个答案:

答案 0 :(得分:2)

箭头功能执行not bind its own arguments,因此您的功能无效。

String.prototype.format = () => {}更改为String.prototype.format = function () {}会为您解决此问题。

答案 1 :(得分:0)

它很好,因为你正在使用this.toString();this是一个json对象。

试一试:

String.prototype.format = function() { ...

代替:

String.prototype.format = () => { ...