有没有办法破解console.log的解决方案

问题描述 投票:1回答:3

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

javascript console.log
3个回答
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
投票

基于上面的讨论和@JaromandaX和JavaScript:下面的权威指南是一个简单的polyfill。

function log() {
    if (location.hostname === 'twitter.com'){
        Object.getPrototypeOf(console).log.apply(console, arguments);
    } else {
        console.log.apply(console, arguments);
    }
}

1
投票

由于这是一个Chrome扩展程序,因此您将内容脚本设置为run_at: "document_start" - 您可以(理论上)“抓住” 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和朋友

© www.soinside.com 2019 - 2024. All rights reserved.