在括号后添加新行

时间:2016-12-17 21:50:11

标签: javascript jquery console.log

我代理函数console.log以向我的日志添加一些信息,我还要检查记录的信息是否是一个对象。我这样做是为了避免获得排序的日志条目

2016-12-17 (22:12:51) > [object Object]

代码在传递非对象的参数时工作正常。例如,命令

console.log("hello","world");

打印

2016-12-17 (22:23:53) > hello
2016-12-17 (22:23:53) > world

但是如果我也传递一个对象,代码将无法在对象后面插入一个新行。例如,命令

console.log("hello",{world:true,hello:{amount:1,text:"hello"}},"world");

打印

2016-12-17 (22:27:32) > hello
2016-12-17 (22:27:32) > { world: true, hello: { amount: 1, text: hello } } 2016-12-17 (22:27:33) > world

(注意显示对象后缺少的换行符。)

代码

JQuery 3.1.1

main.js:

(function (proxied) {
    function displayArg(argument){
        var result= "";
        if(typeof argument == "object") {
            result += "{ ";
            for (i in argument) {
                result += i + ": ";
                result += (displayArg(argument[i]));
                result += ", "
            }
            result = result.substring(0,result.length - 2);
            result += " }";
            return result;
        } else {
            return argument;
        }
    }

    console.log = function () {
        var result = [];
        for (i in arguments) {
            var d = new Date();
            result[i] = d.getFullYear() + "-" + (d.getMonth() + 1)  + "-" + d.getDate() +
                " (" + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds() + ") > ";
            result[i] += displayArg(arguments[i]);
            result[i] += "\n";
        }
        return proxied.apply(this, result);
    }
})(console.log);

2 个答案:

答案 0 :(得分:0)

我没有完全理解目标,但是下面的过度简化覆盖的内容是什么:

{{1}}

答案 1 :(得分:0)

  

TL; DR 更改迭代器变量,以便他们不共享名称,或添加" var"循环定义,以确保它们不会超出你想要的范围。

事实证明来自(我自己的) console.log displayArg 的for循环是"分享"迭代器 i 的值。这是因为通过不声明迭代器变量,范围比我需要的范围更广。为了澄清,请看这个例子:

console.log({isThis:"real life"},"hello","world")

console.log 中的代码会在 result [0] 的开头添加日期,然后调用 displayArg(arguments [0])参数[0] {isThis:"现实生活"} 。该函数将迭代对象属性,因此 i 将被赋值 isThis 。函数返回后, i 的值不会返回 0 。相反, i isThis ,因此,行

result[i] += "\n";

转换为

result[isThis] += "\n"

而不是

result[0] += "\n"

最明智的解决方案可能是在迭代器的for声明中添加 var 。以下代码按预期工作:

(function (proxied) {
    function displayArg(argument){
        var result= "";
        if(typeof argument == "object") {
            result += "{ ";
            for (var i in argument) {
                result += i + ": ";
                result += (displayArg(argument[i]));
                result += ", "
            }
            result = result.substring(0,result.length - 2);
            result += " }";
            return result;
        } else {
            return argument;
        }
    }

    console.log = function () {
        var result = [];
        for (var i in arguments) {
            var d = new Date();
            result[i] = d.getFullYear() + "-" + (d.getMonth() + 1)  + "-" + d.getDate() +
                " (" + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds() + ") > ";
            result[i] += displayArg(arguments[i]);
            result[i] += "\n";
        }
        return proxied.apply(this, result);
    }
})(console.log);