NodeJS对象继承

时间:2016-10-30 08:17:15

标签: javascript node.js inheritance

我有一个扩展Error对象的自定义错误对象:

function GTError(reason, loglevel, meta) {
    winston.log(loglevel, reason, meta);
    GTError.super_.apply(this, arguments);
}

util.inherits(GTError, Error);

我知道这不起作用,而this question也有解决方法。我的问题不是如何解决它,我的问题是为什么不起作用?为什么调用GTError.super_.apply(this, arguments);(其中GTError.super_Error)不会填充message的{​​{1}}属性?

enter image description here

你可以解释一下吗? 感谢

1 个答案:

答案 0 :(得分:1)

  

我的问题不是如何解决这个问题,我的问题是为什么不起作用?

因为Error函数始终返回一个新实例,即使您没有使用new调用它;当你调用它时,它不会修改对象this。来自the ES5 specification

  

Error作为函数而不是构造函数调用时,它会创建并初始化一个新的Error对象。因此,函数调用Error(…)等同于具有相同参数的对象创建表达式new Error(…)

因此,在您的代码中,GTError.super_.apply(this, arguments);(其中GTError.super_Error)实际上是无操作,因为它会创建并丢弃Error对象而不是制作Error填充传递为this的对象。实际上,由于Error表达方式newnew GTError无法在Error中填充由Error创建的对象。定义

TC-39委员会在ES2015中确定了这一点,但仅限于您使用新课程时(为了保持向后兼容性)。

我知道你说你只是想知道原因,但是对于其他人:在ES2015及更高版本中,你可以通过新的class内容正确地将let winston = { log: function(...args) { console.log("log", ...args); } }; class GTError extends Error { constructor(reason, loglevel, meta) { winston.log(loglevel, reason, meta); super(reason, loglevel, meta); } } try { throw new GTError("reason", 10, "meta"); } catch (e) { console.log(e instanceof Error); console.log(e instanceof GTError); console.log(e.message); }子类化。至少在严格模式下的Node v4中支持此语法,并且在Node v6中通用。以下内容适用于任何最新版本的Chrome或Firefox:



$("#prop_id")
    .change(function () {
        var str = "";
        $("#prop_id option:selected").each(function () {
            str += $(this).text() + " ";
        });
        $("#removeid").val(str);
    }).change();