【问题标题】:Why does calling Object.getOwnPropertyDescriptors on a date object return an empty array?为什么在日期对象上调用 Object.getOwnPropertyDescriptors 返回一个空数组?
【发布时间】:2021-11-15 12:54:37
【问题描述】:

我试图了解 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: 
// {}

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

【问题讨论】:

    标签: javascript object types descriptor


    【解决方案1】:

    日期对象不包含任何自己的属性。每the spec

    21.4.5 日期实例的属性

    Date 实例是从 Date 原型对象继承属性的普通对象。 Date 实例也有一个 [[DateValue]] 内部槽。 [[DateValue]] 内部槽是这个日期所代表的时间值。

    就是这样。

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

    我可以通过访问它来获取日期的值作为一个字符串

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

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

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

    【讨论】:

    • 这很有帮助,谢谢!
    猜你喜欢
    • 2019-04-10
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2014-12-27
    • 1970-01-01
    相关资源
    最近更新 更多