对象传播错误导致没有消息 属性
Object spread an Error results in no message property
我正在尝试传播错误,以便我可以在不影响原始错误的情况下更改错误。
const error = new Error('Error test');
const freeError = {...error};
console.log(error, freeError);
但是输出的是一个空对象{}
。我预计 freeError
至少有 条消息 属性,但有 none.
这是 JavaScript 功能的一部分,还是我的代码或引擎有问题?
我知道解决这个问题的方法,但它需要额外的工作{...error, message: error.message}
。所以,是的,我只需要一个说明,这样我就可以确定我没有遗漏任何东西。谢谢。
对象传播only copies可枚举的自身属性,至少在某些环境下,message
不是可枚举的属性.
在Chrome中是不可枚举的自身属性,在Firefox中是Error.prototype
的属性:
const error = new Error('Error test');
// Chrome logs an object (including "enumerable": false,)
console.log(Object.getOwnPropertyDescriptor(error, 'message'));
// Firefox logs an object (including "enumerable": false,)
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(error), 'message'));
它依赖于实现。我会手动提取您需要的所有属性:
const error = new Error('Error test');
const { message, stack } = error;
const freeError = { message, stack };
console.log(freeError);
首先,请注意您所做的不是解构——它被称为对象传播。
展开对象只考虑 ownProperty
秒。 Error
个实例没有任何非继承属性。这就是为什么 console.log(error)
也输出 {}
:
const error = new Error('Error test');
const freeError = {...error};
console.log(error, freeError);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Properties
因为继承的属性不是传播结果对象的一部分,error
确实有消息 属性(继承自其原型),而 freeError
没有。
检查这个例子:
const str = new String('Hello world');
const freeStr = { ...str };
console.log(str.length); // 11
console.log(freeStr.length); // undefined
如你所见str
确实有一个length
属性(继承自String
prototype
),而 freeStr
没有 它(原因与您的示例相同)。
同样,请在此处查看 MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_instances
const freeError = {...error};
类似于
const freeError = Object.assign({}, error);
如果要获取属性,
const freeError = Object.assign({message: error.message}, error);
我正在尝试传播错误,以便我可以在不影响原始错误的情况下更改错误。
const error = new Error('Error test');
const freeError = {...error};
console.log(error, freeError);
但是输出的是一个空对象{}
。我预计 freeError
至少有 条消息 属性,但有 none.
这是 JavaScript 功能的一部分,还是我的代码或引擎有问题?
我知道解决这个问题的方法,但它需要额外的工作{...error, message: error.message}
。所以,是的,我只需要一个说明,这样我就可以确定我没有遗漏任何东西。谢谢。
对象传播only copies可枚举的自身属性,至少在某些环境下,message
不是可枚举的属性.
在Chrome中是不可枚举的自身属性,在Firefox中是Error.prototype
的属性:
const error = new Error('Error test');
// Chrome logs an object (including "enumerable": false,)
console.log(Object.getOwnPropertyDescriptor(error, 'message'));
// Firefox logs an object (including "enumerable": false,)
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(error), 'message'));
它依赖于实现。我会手动提取您需要的所有属性:
const error = new Error('Error test');
const { message, stack } = error;
const freeError = { message, stack };
console.log(freeError);
首先,请注意您所做的不是解构——它被称为对象传播。
展开对象只考虑 ownProperty
秒。 Error
个实例没有任何非继承属性。这就是为什么 console.log(error)
也输出 {}
:
const error = new Error('Error test');
const freeError = {...error};
console.log(error, freeError);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Properties
因为继承的属性不是传播结果对象的一部分,error
确实有消息 属性(继承自其原型),而 freeError
没有。
检查这个例子:
const str = new String('Hello world');
const freeStr = { ...str };
console.log(str.length); // 11
console.log(freeStr.length); // undefined
如你所见str
确实有一个length
属性(继承自String
prototype
),而 freeStr
没有 它(原因与您的示例相同)。
同样,请在此处查看 MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#Error_instances
const freeError = {...error};
类似于
const freeError = Object.assign({}, error);
如果要获取属性,
const freeError = Object.assign({message: error.message}, error);