为何对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
相关产品推荐
相关产品推荐

