You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

原型链中同一属性为何存在不同值?Error对象属性疑问

Error实例与原型链中message属性共存的原因

问题本质

你看到的现象是完全正常的——Error实例本身会创建专属的message自有属性,而Error.prototype上的message是该类型对象的默认值,二者不是覆盖关系,而是分别存在于实例和原型两个不同层级。

具体逻辑拆解

当执行new Error('错误信息')时:

  1. Error构造函数的内部逻辑会直接在新生成的实例对象上添加message自有属性,值就是你传入的参数。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:23:15