在 setter 函数中获取堆栈溢出

Getting a stack overflow in a setter function

我在 JavaScript 中写了一个 class 来弄清楚 classes 是如何工作的。我 运行 遇到 setter 函数的错误。我定义了以下 class 表示一个简单的多边形,包含边数、边长和多边形类型:

class polygon{
    constructor(numbOfSides=0, sideLens=[], type=null){
        this.numberOfSides = numbOfSides;
        this.sideLengths = sideLens;
        this.typeOfPoly = type;
    }

    set numberOfSides(numbOfSides=0){
        if (numbOfSides > 0) return undefined;
        this.numberOfSides = numbOfSides;
    }
    set sideLengths(sideLens=[]){
        if (sideLens.length == 0) return undefined;
        this.sideLengths = sideLens;
    }
    set typeOfPoly(type=null){
        if (type == undefined) return undefined;
        this.typeOfPoly = type;
    }
    get numberOfSides(){return numberOfSides;}
    get sideLengths(){return sideLengths;}
    get typeOfPoly(){return typeOfPoly;}
    calcPerimeter(){
        let counter = 0;
        for (let item of sideLengths){
            counter += item;
        }
    }
}

const myPolygon = new polygon(4, [4, 6], "Rectangle");
console.log(myPolygon.numberOfSides);
console.log(myPolygon.calcPerimeter());

创建对象的实例时,我收到堆栈溢出错误:

 set sideLengths(sideLens=[]){
                ^
 RangeError: Maximum call stack size exceeded

为什么我会收到这样的错误?

Setter 是处理赋值的特殊函数。您的代码相当于以下函数调用。

setSideLengths(sideLens=[]){
    if (sideLens.length == 0) return undefined;
    this.setSideLengths(sideLens);
}

递归调用自身,导致调用栈溢出

如果你想把这个值保存在某个地方,传统的方法是用下划线作为前缀 属性 同名保存。

set sideLengths(sideLens=[]){
    if (sideLens.length == 0) return undefined;
    this._sideLengths = sideLens;
}