使错误的消息属性可枚举

时间:2014-10-25 10:36:06

标签: javascript

是否可以制作错误对象"消息"属性可枚举,以便在对其进行字符串化时:

var errstr = JSON.stringify(new Error('my error'));

这样它就会为您{"message":"my error"}而不是{}

我知道你可以为每个单独的对象做到这一点

var err = new Error('my error');
Object.defineProperty(err, 'message', {
  enumerable: true,
});
var errstr = JSON.stringify(err);
//=> {"message":"my error"}

但可以对Error对象本身进行操作,因此您不必对其每个实例执行此操作吗?

2 个答案:

答案 0 :(得分:1)

Welp,我想我可以改变JSON.stringify本身,如果不是Error

(function() {
    var stringify = JSON.stringify;
    JSON.stringify = function(obj) {
        if (obj instanceof Error)
            Object.defineProperty(obj, 'message', {
                enumerable: true,
            });
        return stringify(obj);
    };
})();

答案 1 :(得分:0)

对于将 message 以外的属性放在其 Error 对象上并希望它们也正确地 JSON.stringify 的任何人:

class JsonableError extends Error {
    toJSON() {
        return JSON.stringify(Object.assign({ message: this.message }, this));
    }
}

甚至(如果您想使用 JSON 对象构建错误):

class JsonObjectError extends Error {
    constructor(input) {
        super();
        Object.assign(this, input);
    }
}

然后您可以执行 new JsonObjectError({ "message": "foo", "something": "else" }) 并正确地进行字符串化。第二个版本甚至使 message 成为 Error 对象的可枚举属性。