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

为何对Date实例调用Object.getOwnPropertyDescriptors返回空对象?

问题解答

你观察到的差异本质是不同内置对象的属性存储逻辑不同,核心原因如下:

1. Date实例的时间值存储在引擎内部槽中,不属于实例自有属性

Object.getOwnPropertyDescriptors 只能返回对象自身显式挂载的公开属性的描述符,而Date实例的时间戳是存储在JS引擎内部的[[DateValue]]私有槽里,这个内部槽不属于规范定义的公开自有属性,自然不会被该方法捕获,所以返回空对象。

你之前遇到的两类场景都符合「属性挂载在实例自身」的逻辑:

  • 自定义对象{bar:2}的bar是你显式声明的自有属性
  • Error实例的message、stack等属性是Error构造函数执行时直接挂载到实例自身的自有属性

所以这两类对象调用方法都能拿到对应的描述符。

2. 你能拿到日期字符串是原型方法的作用,不是读取实例自有属性

你直接访问Date实例时得到的日期字符串,本质是触发了Date原型上的toString()方法的返回值,不是读取了实例自身的属性。你日常调用的getFullYear()、getTime()等日期API,也都是Date原型上的方法,它们会主动读取实例的[[DateValue]]内部槽进行计算返回,和实例自有属性无关。

你可以用下面的代码验证这个逻辑:

let foo = new Date();
// 手动给实例加一个自有属性
foo.customProp = '测试'
console.log(Object.getOwnPropertyDescriptors(foo));
// 输出会包含customProp的描述符,证明方法本身是正常工作的

补充说明

你在开发者工具中直接打印Date实例时看到的日期值,是工具为了便于调试做的友好展示,工具会主动读取内部[[DateValue]]槽转换为可读字符串,不代表这个值是实例的公开自有属性。


内容的提问来源于stack exchange,提问作者Julian Lachniet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:06:02