我代理函数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);
答案 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);