复制/覆盖javascript的console.log函数

时间:2014-09-06 10:30:12

标签: javascript html objective-c macos cocoa

好的,所以这就是我要做的事情:

  • 我正在构建一个Javascript-> Cocoa / Objective-C桥接器(实际上是一个很小的测试),这意味着我可以从我的JavaScript代码中调用Objective-C函数。
  • 其中一个问题是来自console.log的消息/错误/日志/等是不可见的,因此它们将被转发到相应的Cocoa函数(我创建了一个像- (void)log:(NSString*)msg这样的函数将参数作为字符串并在Xcode的控制台窗口中打印出来。

现在,问题是如何100%复制console.log所做的事情+将消息转发给我自己的log函数?

这是我到目前为止所做的:

的Javascript

console.log = function(text) {
    API.log_(text);
}

目标C

- (void)log:(NSString*)msg
{
    NSLog(@"Logging from JS : %@", msg);
}

如果调用console.log("something")时“text”是一个简单的文本字符串,那么它可以正常工作。如果我将console.log函数传递给一个对象,那么它就不能按预期工作(例如在Chrome的Javascript控制台窗口中)。

你会怎么做?

是否可以获取console.log 正常打印出来的字符串输出?


P.S。我尝试了JSON.stringify(obj, null, 4)一点,但它似乎仍然不对。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

听起来您希望保留原始功能,同时捕获输入并将其传递给API。这可以通过 (JSFiddle)

等方式实现
var original = console.log,
    API = {
        log_: function() {
            // Your API functionality
        }
    };

console.log = function() {    
    original.apply(console, arguments);
    API.log_(arguments);
};

有几点需要指出。首先,原生console.log可以接收任意数量的参数,因此我们使用arguments来处理此问题。我们必须使用.apply()console的上下文中调用原始方法,它还允许我们完全按照原始调用的方式传递参数。