在setter函数中获取堆栈溢出



我用JavaScript编写了一个类来了解类的工作原理。我在使用setter函数时遇到了一个错误。我定义了以下类,它表示一个简单的多边形,包括边的数量、边的长度和多边形的类型:

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;
}

最新更新