为什么在日期对象 return 上调用 Object.getOwnPropertyDescriptors 是一个空数组?

Why does calling Object.getOwnPropertyDescriptors on a date object return an empty array?

我正在尝试了解 JavaScript 对象如何充分工作。我知道当你在一个对象上调用 Object.getOwnPropertyDescriptors 时,你会得到一个包含描述符的对象。例如,如果您定义了自己的对象并获得了描述符,您将得到如下内容:

let foo = {
  bar: 2
}

Object.getOwnPropertyDescriptors(foo);
// Output: 
// {
//   bar: {
//     value: 2,
//     writable: true,
//     enumerable: true,
//     configurable: true,
//   }
// }

同样,如果您获得内置对象的描述符,例如像一个Error,你可以看到错误对象的描述符。

let foo = new Error();

Object.getOwnPropertyDescriptors(foo);
// Output: 
// {
//   bar: {
//     value: 'Error\n    at <anonymous>:1:11',
//     writable: true,
//     enumerable: false,
//     configurable: true,
//   }
// }

我知道 属性 是在调用 Error 构造函数时创建的。我刚才所说的一切对我来说都很有意义。但是,当我尝试获取日期对象的描述符时,没有返回任何内容。

let foo = new Date();

Object.getOwnPropertyDescriptors(foo);
// Output: 
// {}

我可以通过访问它来获取日期值作为字符串,但为什么没有该值的描述符?

据说日期对象不包含任何自有属性。每 the spec:

21.4.5 Properties of Date Instances

Date instances are ordinary objects that inherit properties from the Date prototype object. Date instances also have a [[DateValue]] internal slot. The [[DateValue]] internal slot is the time value represented by this Date.

就是这样。

给定日期包含的所有信息都在 [[DateValue]] 内部插槽中,不会通过 JavaScript 直接公开 - 它只能通过 Date.prototype 上的方法访问和操作,日期实例继承自的对象。

I can get the value of the date as a string just by accessing it

之所以可行,是因为您将调用 原型 上存在的 toString 方法。例如:

const proto = {
  toString() {
    return 'foo';
  }
};
const instance = Object.create(proto);
console.log(instance.toString());
console.log(Object.getOwnPropertyDescriptors(instance));

对象可以 toString 调用它而无需直接在实例上具有任何属性。