有没有办法解决网站中断 console.log

Is there a way to work-around site(s) breaking 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 什么都没有产生!

问题:有没有办法调用"now gone"console.log"native code"?

(关于那种 JavaScript "WAT" 行为的评论 收回 ,有点)

据我所知,这取决于替换的深度。 例如如果是这样

 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 () {}

不幸的是,我不知道这种情况的解决方法。

基于上面的讨论和@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);
    }
}

由于这是一个 Chrome 扩展,您将内容脚本设置为 run_at: "document_start" - 您可以(理论上)"grab" console.log / error / dir / info 等等,在 Twitter 弄脏之前

实际上,知道 twitter 只替换日志、警告、信息、错误,你可以简单地做:

var _console = ['log', 'warn', 'info', 'error'].reduce(function(result, key) { 
    result[key] = console[key].bind(console); 
    return result
}, {});

然后你可以使用_console.log和朋友