有办法破解console.log

时间:2016-02-10 09:47:38

标签: javascript console.log

我的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”行为撤回的评论

3 个答案:

答案 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和朋友