Javascript 如何在ES2015中重写窗口上的方法

Javascript 如何在ES2015中重写窗口上的方法,javascript,ecmascript-6,ecmascript-harmony,Javascript,Ecmascript 6,Ecmascript Harmony,我正试图将一个普通的ES5闭包改写成一个ES2015类。该代码覆盖window.onerror函数,并作为全局错误处理程序方法用于日志记录 我的旧代码是这样的。我想知道如何在ES2015中重写它。如何覆盖Window.onerror (function() { window.onerror = function(errorMessage, url, line) { try { if (typeof(url) ===

我正试图将一个普通的ES5闭包改写成一个ES2015类。该代码覆盖window.onerror函数,并作为全局错误处理程序方法用于日志记录

我的旧代码是这样的。我想知道如何在ES2015中重写它。如何覆盖Window.onerror

    (function() {

        window.onerror = function(errorMessage, url, line) {
            try {
                if (typeof(url) === "undefined") {
                    url = "";
                }
                if (typeof(line) === "undefined") {
                    line = "";
                }

                // Avoid error message being too long...
                if (errorMessage.length > 300) {
                    errorMessage = errorMessage.slice(0,300) + "...";
                }

                errorMessage = errorMessage.replace(/&/g, "%26").replace(/ /g, "+");
                url = url;
                line = line;
                var parentUrl = encodeURIComponent(document.location.href);

                // Set error details
                var parameters = "error_message=" + errorMessage +
                                 "&url=" + url +
                                 "&line=" + line +
                                 "&parent_url=" + parentUrl;

                // Set path to log target
                var logUrl = "xxx";

                // Set error details as image parameters
                new Image().src = logUrl + '?' + parameters;
            } catch (e) {}
        };

    }()); 

编辑 现在我试图在JS类中重写它。所以我想我必须扩展Window类或类似的东西(我有Java背景)。但据我所知,Window不是一个类。这就是我目前所拥有的。

所以我需要帮助来覆盖window.onerror函数,它是用ES2015编写的


这里唯一有用的是参数默认值。我在ES5中更改的所有其他内容都是错误的

window.onerror = function(errorMessage, url="", line="") {
    try {
        // Avoid error message being too long...
        if (errorMessage.length > 303) {
            errorMessage = errorMessage.slice(0,300) + "...";
        }
        var parentUrl = document.location.href;

        // Set error details
        var parameters = "error_message=" + encodeURIComponent(errorMessage).replace(/%20/g, "+") +
                         "&url=" + encodeURIComponent(url) +
                         "&line=" + encodeURIComponent(line) +
                         "&parent_url=" + encodeURIComponent(parentUrl);

        // Set path to log target
        var logUrl = "xxx";

        // Set error details as image parameters
        new Image().src = logUrl + '?' + parameters;
    } catch (e) {}
};

ES2015与浏览器功能(如
onerror
回调)关系不大。您的代码现在到底有什么问题?什么不起作用?在ES2015中,如何为属性分配新值没有改变。您仍然需要
obj.property=newValue。ES2015并没有改变一切。90%未更改。请查看我的编辑!我添加了我当前的代码。我如何在JS2015类中重写Window.onerror方法?为什么要将整个处理程序的代码包装到try..catch中?@rd5:因为OP也这样做了,所以我没有更改它。如果我不得不猜测的话,它应该能够防止全局错误处理代码中的异常无限地触发自身。当然,在空的catch块中可能值得一提。
window.onerror = function(errorMessage, url="", line="") {
    try {
        // Avoid error message being too long...
        if (errorMessage.length > 303) {
            errorMessage = errorMessage.slice(0,300) + "...";
        }
        var parentUrl = document.location.href;

        // Set error details
        var parameters = "error_message=" + encodeURIComponent(errorMessage).replace(/%20/g, "+") +
                         "&url=" + encodeURIComponent(url) +
                         "&line=" + encodeURIComponent(line) +
                         "&parent_url=" + encodeURIComponent(parentUrl);

        // Set path to log target
        var logUrl = "xxx";

        // Set error details as image parameters
        new Image().src = logUrl + '?' + parameters;
    } catch (e) {}
};