【问题标题】:How to override method on Window in ES2015如何在 ES2015 中覆盖 Window 上的方法
【发布时间】:2016-01-11 07:52:56
【问题描述】:

我正在尝试将普通 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 不是我理解的类。这是我到目前为止所拥有的。

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

export const Logging = new class {

    constructor() {
        // todo
    }

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

            // truncate error message if necessary
            if (errorMessage.length > 300) {
                errorMessage = errorMessage.slice(0,300) + "...";
            }

            // URI encoding
            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
            var img = new Image().src = logUrl + '?' + parameters;

            console.log(img);
        }
        catch (e) {}
    }

}

/* ------------------------------------------------------------------------------------------------------------ */

export default Logging;

【问题讨论】:

  • ES2015 与 onerror 回调这样的浏览器功能没有太大关系。您的代码现在到底有什么问题?什么不起作用?
  • 如何为属性分配新值在 ES2015 中没有改变。你还是obj.property = newValue;。 ES2015 并没有改变一切。 90% 没有改变。
  • 请看我的编辑!我添加了我当前的代码。如何覆盖 JS2015 类中的 Window.onerror 方法?

标签: javascript ecmascript-6 ecmascript-harmony


【解决方案1】:

这里唯一可能有用的是参数默认值。我在 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) {}
};

【讨论】:

  • 为什么要将整个处理程序的代码包装到 try..catch 中?
  • @rd5:因为 OP 也是如此,所以我没有改变它。如果我不得不猜测,它应该防止全局错误处理代码中的异常无限地触发自身。当然,可能值得在空的 catch 块中发表评论。
猜你喜欢
  • 1970-01-01
  • 2016-08-17
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
相关资源
最近更新 更多