是否可以制作错误对象"消息"属性可枚举,以便在对其进行字符串化时:
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
对象本身进行操作,因此您不必对其每个实例执行此操作吗?
答案 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
对象的可枚举属性。