尝试将值分配给相同的 属性 内部访问器集时,超出了最大调用堆栈大小

Maximum call stack size exceeded when trying to assign value to the same property inside accessor set

以下对象使用 set birthdate accesor 来设置用户的年龄,它工作正常。

const user = {
  set birthdate(value) {
    if (isNaN(Date.parse(value))) {
      throw new Error("Invalid date format");
    }

    const valueYear = new Date(value).getFullYear();
    const todayYear = new Date().getFullYear();
    const age = todayYear - valueYear;

    if (age < 18) {
      throw new Error("Invalid user age");
    }

    this.age = age;
  },
};

user.birthdate = "1980-01-29";

console.log(user.age);

现在我需要获取生日,但是当我在 set 访问器中尝试 this.birthdate = new Date(value); 时,我收到 InternalError: too much recursion 错误消息

const user = {
  set birthdate(value) {
    if (isNaN(Date.parse(value))) {
      throw new Error("Invalid date format");
    }

    const valueYear = new Date(value).getFullYear();
    const todayYear = new Date().getFullYear();
    const age = todayYear - valueYear;

    if (age < 18) {
      throw new Error("Invalid user age");
    }

    this.birthdate = new Date(value); // when adding this line the error occurs
    this.age = age;
  },
};

user.birthdate = "1980-01-29";

console.log(user.age);

在对象中使用 属性 获取生日设置值的正确方法是什么?

这里的问题是您已经为 birthdate 属性 定义了 setter,因此任何尝试设置 birthdate 属性 的值都会导致在调用 setter 函数时。由于您在 setter 函数中设置 this.birthdate,因此会一次又一次地递归调用此函数。

您需要使用不同的 属性 名称来存储出生日期

const user = {
  set birthdate(value) {
    if (isNaN(Date.parse(value))) {
      throw new Error("Invalid date format");
    }

    const valueYear = new Date(value).getFullYear();
    const todayYear = new Date().getFullYear();
    const age = todayYear - valueYear;

    if (age < 18) {
      throw new Error("Invalid user age");
    }

    this.bDate = new Date(value);
    this.age = age;
  },
};

user.birthdate = "1980-01-29";

console.log(user.age);
console.log(user.bDate.toDateString());