我的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”行为撤回的评论
答案 0 :(得分:1)
据我所知,这取决于更换的深度。 例如,如果它是这样的
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 () {}
不幸的是,我不知道这种情况的解决方法。
答案 1 :(得分:1)
基于上面的讨论,下面的@JaromandaX和JavaScript: The Definitive Guide是一个简单的polyfill。
function log() {
if (location.hostname === 'twitter.com'){
Object.getPrototypeOf(console).log.apply(console, arguments);
} else {
console.log.apply(console, arguments);
}
}
答案 2 :(得分:1)
由于这是Chrome扩展程序,因此您将内容脚本设置为run_at: "document_start"
- 您可以(理论上)"抓住"推特之前,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
和朋友