原型链中同一属性为何存在不同值?Error对象属性疑问
Error实例与原型链中message属性共存的原因
问题本质
你看到的现象是完全正常的——Error实例本身会创建专属的message自有属性,而Error.prototype上的message是该类型对象的默认值,二者不是覆盖关系,而是分别存在于实例和原型两个不同层级。
具体逻辑拆解
当执行new Error('错误信息')时:
- Error构造函数的内部逻辑会直接在新生成的实例对象上添加
message自有属性,值就是你传入的参数。 Error.prototype上的message是原型对象的自有属性,默认值为空字符串,这是ECMAScript标准规定的——它是所有Error实例在没有自己的message属性时,会 fallback 到的默认值。
这种设计和普通自定义类不同:普通类一般只在原型上定义方法/属性,实例不会自动生成同名自有属性,但Error构造函数的实现逻辑就是要给实例单独加message属性。
验证代码
你可以用Object.hasOwn()分别验证实例和原型上的属性归属:
const err = new Error('This is a test error'); console.log(Object.hasOwn(err, 'message')); // true,实例自有该属性 console.log(Object.hasOwn(Error.prototype, 'message')); // true,原型也自有该属性
关于你的方法
你的getAllProperties方法会遍历原型链的每一层,收集每个层级的自有属性,所以能同时拿到实例和原型上的message——这是方法逻辑的正常输出,既不是继承体系的问题,也不是你的认知错误。
内容的提问来源于stack exchange,提问作者Nabor
相关产品推荐
相关产品推荐

