我的Chrome DevTools控制台节选:
Navigated to https://twitter.com/
console.log.toString();
"function (){}"
Navigated to http://linuxfr.org/
console.log.toString();
"function log() { [native code] }"我使用Chrome扩展成功地将代码注入到twitter.com的主框架中,但我很难理解为什么我的代码似乎没有运行。看来我的代码运行得很好,除了console.log完全没有产生任何结果!
问:有没有一种方法可以将“现在消失的”console.log称为“本机代码”?
(关于那种JavaScript "WAT“行为的评论,某种程度上)
发布于 2016-02-10 12:02:07
因为这是一个Chrome扩展,所以您可以将内容脚本设置为run_at: "document_start" --(理论上)可以在twitter得到它们之前“抓取”console.log / error / dir / info等等。
实际上,知道twitter只取代了日志、警告、信息、错误,你可以简单地做:
var _console = ['log', 'warn', 'info', 'error'].reduce(function(result, key) {
result[key] = console[key].bind(console);
return result
}, {});然后你可以使用_console.log和朋友
发布于 2016-02-10 09:56:25
据我所知,这取决于更换的深度。例如,如果是这样
console.log = function () {};原始的本机log函数仍在原型中。您可以使用__proto__属性或Object.getPrototypeOf方法访问它。
console.log = null
Object.getPrototypeOf(console).log
//log() { [native code] }此外,您也可以从原始控制台对象中删除替换。
delete console.log
//true
console.log
//log() { [native code] }但是,如果像这样替换日志函数,上述所有代码都无法工作。
console.__proto__.__proto__.log = function () {}不幸的是,我不知道这个案子的解决办法。
发布于 2016-02-10 10:15:14
基于上面的讨论和@JaromandaX和JavaScript:权威指南,下面是一个简单的填充。
function log() {
if (location.hostname === 'twitter.com'){
Object.getPrototypeOf(console).log.apply(console, arguments);
} else {
console.log.apply(console, arguments);
}
}https://stackoverflow.com/questions/35311671
复制相似问题