我想制作一个像这样的功能。
例如:
function Logger() {
this.log = function(msg) {
console.log(msg);
}
}
我想在功能/模块等中使用它,一切正常。 但是浏览器中的默认控制台通常会给出fileName + lineNumber。
现在当我抽象这个功能时,fileName
和lineNumber
不是我放置instance.log()的地方。因为它会说调用console.log的地方,而不是函数本身。
所以我的问题:
如何从我想要使用记录器的位置获取正确的信息? 或者,请给我任何改进此功能的提示。
答案 0 :(得分:16)
function Logger() {
this.log = console.log.bind(console);
}
前段时间我问过这个问题:Create shortcut to console.log() in Chrome。
答案 1 :(得分:0)
尝试使用像这样的回溯功能:
function printStackTrace() {
var callstack = [];
var isCallstackPopulated = false;
try {
i.dont.exist += 0; //doesn't exist- that's the point
} catch (e) {
if (e.stack) { //Firefox
var lines = e.stack.split('\n');
for (var i = 0, len = lines.length; i & lt; len; i++) {
if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
callstack.push(lines[i]);
}
}
//Remove call to printStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
else if (window.opera & amp; & amp; e.message) { //Opera
var lines = e.message.split('\n');
for (var i = 0, len = lines.length; i & lt; len; i++) {
if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
var entry = lines[i];
//Append next line also since it has the file info
if (lines[i + 1]) {
entry += ' at ' + lines[i + 1];
i++;
}
callstack.push(entry);
}
}
//Remove call to printStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
}
if (!isCallstackPopulated) { //IE and Safari
var currentFunction = arguments.callee.caller;
while (currentFunction) {
var fn = currentFunction.toString();
var fname = fn.substring(fn.indexOf( & amp; quot;
function & amp; quot;) + 8, fn.indexOf('')) || 'anonymous';
callstack.push(fname);
currentFunction = currentFunction.caller;
}
}
output(callstack);
}
function output(arr) {
//Optput however you want
alert(arr.join('\n\n'));
}
答案 2 :(得分:0)
尝试分配功能:
(function () {
window.log = (console && console.log
? console.log
: function () {
// Alternative log
});
})();
稍后只需在代码中调用log('Message')
。