在 JavaScript ES6 class 中无限期调用 "set function()"

indefinite call to "set function()" in JavaScript ES6 class

我在 JavaScript 中 运行 这个简单的 class 但在控制台中它给我一个 "Maximum call stack size exceeded" 错误。和帮助?!?

class Person {

        constructor(name, age) {
            this.name = name;
            this.age = age;
        }

        get name() {
            return String(this.name);
        }
        get age() {
            return String(this.age);
        }

        set name(name) {
            this.name = name;
        }

        set age(age) {
            this.age = age;
        }
}

let p1 = new Person('Ehsan', 23);

这是控制台的屏幕截图

}

如果要表明 age 属性 不应直接使用,则应使用与 setters 使用的名称不同的 属性 名称和 getters。如果 setter / getter 设置或获取的 属性 与 setter 或 getter 的名称相同,它将继续调用自身,结果在你的错误中。

一个常见的约定是在 属性:

之前加一个下划线

class Person {

  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  get name() {
    return String(this._name);
  }
  get age() {
    return String(this._age);
  }

  set name(name) {
    this._name = name;
  }

  set age(age) {
    this._age = age;
  }
}

let p1 = new Person('Ehsan', 23);
console.log(p1.age);
p1.age = 32;
console.log(p1.age);

但是 属性 仍然可以通过 p1._age 被消费者看到 - 如果你想防止这种情况发生,你可以通过关闭和 WeakMap:

const Person = (() => {
  const privateVals = new WeakMap();
  return class Person {
    constructor(name, age) {
      const privateObj = {};
      privateObj.name = name;
      privateObj.age = age;
      privateVals.set(this, privateObj);
    }

    get name() {
      return String(privateVals.get(this).name);
    }
    get age() {
      return String(privateVals.get(this).age);
    }

    set name(name) {
      privateVals.get(this).name = name;
    }

    set age(age) {
      privateVals.get(this).age = age;
    }
  }
})();

let p1 = new Person('Ehsan', 23);
console.log(p1.age);
p1.age = 32;
console.log(p1.age);

getter / setter 对和字段不能同名。 this.name = 里面的 setter 本身会调用 setter。如果您确实需要 getter / setter,请使用其他字段,例如this._name = ... 但老实说:不要在这里使用 getter / setter。如果你这样做 person.name = 15 你应该修复它而不是尝试使用 getters / setters.

我相信您只需在构造函数中重命名 class 变量,然后就可以开始了?

class Person {

  constructor(name, age) {
    this._name = name;
    this._age = age;
  }

  get name() {
    return String(this._name);
  }
  get age() {
    return String(this._age);
  }

  set name(name) {
    this._name = name;
  }

  set age(age) {
    this._age = age;
  }
}