首页 > 解决方案 > JavaScript:未捕获的 RangeError

问题描述

我有一个错误,如果我声明this.property而不是this._property. 这里有什么问题?

这是代码:

class Persoana {
    constructor(prenume, nume, varsta) {
        this.prenume = prenume;
        this.nume = nume;
        this.varsta = varsta;
    }
    get info() {
        return `${this.prenume} ${this.nume}`;
    }
    set varsta(val) {
        console.log(`setter varsta: ${val}`);
        this.varsta = val;
    }
}
let ray = new Persoana("ray", "stone", 30);
console.log(ray.info);

我有这个错误:

未捕获的 RangeError:Persoana.set varsta [as varsta] 超出了最大调用堆栈大小(practice4.js:25)

标签: javascript

解决方案


当您有一个属性的 setter 时,任何设置该属性的东西都将隐式调用 setter——即使在 setter 函数中也是如此。当一个函数直接无条件地调用自己时,你会得到那个堆栈错误。

通常,人们对“伴随”属性使用某种约定,例如:

set varsta(val) {
    console.log(`setter varsta: ${val}`);
    this._varsta = val;
}

在这种情况下,您还需要一个吸气剂:

get varsta() { return this._varsta; }

推荐阅读