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

JavaScript Error实例与原型属性存在差异的原因是什么

问题1解答

fileName、lineNumber、columnNumber都不属于ECMAScript官方标准规定的Error属性,是浏览器、Node.js等JS运行环境自行扩展的调试类属性。
运行环境在执行new Error()生成实例的阶段,会直接读取当前代码的执行上下文位置信息,将这三个属性直接挂载到新生成的Error实例上作为自有属性,因此不会出现在Error的原型对象上。
另外你代码里实例自带的message自有属性是标准行为:Error构造函数会将传入的字符串参数直接赋值给实例自身的message属性,原型上的message只是默认值为空白字符串的兜底属性,实例自身有该属性后就不会读取原型上的对应值。

问题2解答

和属性的枚举性无关。Object.getOwnPropertyNames()会返回对象的全部自有属性,不管属性的enumerable配置是true还是false,如果stack是实例的自有属性,必然会被该方法返回。
stack同样是运行环境扩展的属性,以V8内核的运行环境为例,stack默认采用惰性求值的实现逻辑:只有当你第一次主动访问该属性(比如执行console.log(err.stack)或者直接读取err.stack)时,运行环境才会生成完整的调用栈信息,将它挂载为实例的自有属性;未访问前它只是原型上的一个访问器属性(getter),自然不会出现在实例的自有属性列表中。你可以尝试先访问一次err.stack,再调用Object.getOwnPropertyNames(err),就能看到stack出现在返回结果里。

内容的提问来源于stack exchange,提问作者Maciej Kravchyk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:27:03