用无限的可选参数包装console.log

Har*_*vey 2 javascript ecmascript-6

我正在尝试创建一个自定义记录器,console.log它只包装一个但总是在开头添加一些内容,这使得日志来自我的插件非常清楚.

我想出了以下代码:

var log = function(param1, param2) {
    if (typeof param3 !== 'undefined') {
        console.log('[MyPlugin]', param1, param2, param3);
    } else if (typeof param2 !== 'undefined') {
        console.log('[MyPlugin]', param1, param2);
    }
};
Run Code Online (Sandbox Code Playgroud)

这允许开发人员运行以下内容:

log('foo', 'bar');
// Outputs '[MyPlugin] foo bar'

log('foo');
// Outputs '[MyPlugin] foo'
Run Code Online (Sandbox Code Playgroud)

但我希望这可以改进.

这个实现的问题是:

  1. 记录功能仅允许两个参数.如果可以接受许多人会更好.
  2. 有很多重复(多次console.log通话).

我试过了什么

我想也许ES6传播操作员会工作:

var log = function(...params) {
    console.log('[MyPlugin]', params);
};
Run Code Online (Sandbox Code Playgroud)

这允许开发人员运行:

log('foo', 'bar');
// Outputs '[MyPlugin] Array [ "foo", "bar" ]'

log('foo');
// Outputs '[MyPlugin] Array [ "foo" ]'
Run Code Online (Sandbox Code Playgroud)

您可以看到输出与原始函数中的输出不同.

有更好的解决方案吗?

T.J*_*der 11

如果您使用它,传播符号(它不是运算符)确实会这样做.您正在使用rest notation(将参数收集到数组参数中),但不使用扩展符号(在传递它们时将它们展开console.log).这是你如何使用传播:

var log = function(...params) {
// Rest -----------^^^
    console.log('[MyPlugin]', ...params);
    // Spread ----------------^^^
};
Run Code Online (Sandbox Code Playgroud)

例:

var log = function(...params) {
// Rest -----------^^^
    console.log('[MyPlugin]', ...params);
    // Spread ---------------^^^
};

log("testing", 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

如果您需要在不进行转换的情况下支持ES2015之前的环境,您可以使用arguments和执行相同的操作Function#apply:

var log = function() {
    var args = Array.prototype.slice.call(arguments);
    args.unshift('[MyPlugin]');
    console.log.apply(console, args);
};
Run Code Online (Sandbox Code Playgroud)

实例:

var log = function() {
    var args = Array.prototype.slice.call(arguments);
    args.unshift('[MyPlugin]');
    console.log.apply(console, args);
};

log("testing", 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)