为什么即使在堆栈溢出错误之后,在 getter 和 setter 方法中,我的其余代码仍然在 JavaScript 中工作?

Why is it that even after a stack overflow error, in getter and setter methods, the rest of my code still works in JavaScript?

提问人:Ana 提问时间:9/27/2023 最后编辑:VLAZAna 更新时间:9/27/2023 访问量:37

问:

我目前正在学习 Javascript 中的 setter 和 getter,但我遇到了一个问题。我已经将类中的一个属性命名为与我的 get 和 set 方法相同的名称,我知道这可能会导致递归并导致堆栈溢出,但为什么即使在堆栈溢出错误之后,“msg”仍然被分配给“Sandra”?

class ClassWithGetSet{
    msg = 'Hello'; 
    get msg(){
        return this.msg;
    }

    set msg(x){
        this.msg = `Hello ${x}`;
    }
}

const instance = new ClassWithGetSet(); 
console.log(instance.msg); 
instance.msg = 'Sandra'; 
console.log(instance.msg);

我预计会在 Chrome DevTools 控制台上输出错误,但它打印了“Hello”,然后是“Sandra”。非常感谢您的帮助!

JavaScript getter-setter

评论

0赞 VLAZ 9/27/2023
这只是在实例上调用的一个普通属性,您不会访问 getter 和 setter。msg
0赞 Phil 9/27/2023
我认为您指的是有关任何堆栈溢出错误的答案。我想说的是,自 2013 年首次编写以来,情况发生了变化。运行代码时我没有看到任何错误,并且忽略了 setter
0赞 Phil 9/27/2023
澄清一下,您真的会报告错误吗?

答:

1赞 Vivick 9/27/2023 #1

来自 MDN

Getter 属性是在类的 prototype 属性上定义的,因此由类的所有实例共享。

因此,在查找属性时,它会在 getter/setter 对之前找到实例。你永远无法接触到他们。