gpt4 book ai didi

javascript - 在类中使用 getter 和 setter 的无限循环

转载 作者:行者123 更新时间:2023-11-29 20:52:09 25 4
gpt4 key购买 nike

alert("Hello")

class Dog {

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

/*
get name(){
return this.name;
}

set name(value){
this.name = value;
}
*/
}

alert("Hello1");

let pies = new Dog("Reksio", 999);

alert("Hello2");
alert(pies.name);

此代码在没有 getter 和 setter 的情况下工作完美。然而,在取消注释部分后,它会奇怪地崩溃:

Uncaught RangeError: Maximum call stack size exceeded
at Dog.set name [as name] ((index):44)
at Dog.set name [as name] ((index):45)
at Dog.set name [as name] ((index):45)
at Dog.set name [as name] ((index):45)
at Dog.set name [as name] ((index):45)
at Dog.set name [as name] ((index):45)
at Dog.set name [as name] ((index):45)
at Dog.set name [as name] ((index):45)
at Dog.set name [as name] ((index):45)
at Dog.set name [as name] ((index):45)
  1. 为什么我不能单独使用 getter?
  2. 为什么添加简单的 getter 和 setter 后会像无限递归一样崩溃?
  3. 如何修复 getter 和 setter?

最佳答案

通过让setter name 设置成员变量name,您将一次又一次地调用setter name,直到溢出堆栈。

直接针对您的评论:

I Thought that the setter is engaged only for external calls

实际上并没有“内部”或“外部”调用的概念。我假设您将“内部”定义为“来自成员函数内部”或在 this 是构造对象的地方。不管怎样,事实并非如此。定义 setter 后,任何时候您尝试设置属性,无论您是“内部”还是“外部”设置,都将调用 setter。

您必须使用一个中间变量,例如 _name。否则,您将无限递归设置 name

class Foo {
constructor(name = "") {
this._name = name;
}
set name(newVal) {
this._name = newVal;
}
get name() {
return this._name;
}
}

const f = new Foo("foo");
console.log(f.name);

如果您想私有(private)化内部 _name 成员变量,以便 API 使用者被迫通过 name,我很幸运地使用了 Map保持所有 Foo 实例对“私有(private)”变量对象的静态引用的对象。这可能不是很有效,但如果隐私比性能更重要,这是一个选择。

关于javascript - 在类中使用 getter 和 setter 的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51364500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com