问题描述
我用 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;
}