-1

I wrote a class in JavaScript to figure out how classes work. I have run into an error with setter functions. I defined the following class that represents a simple polygon with the number of sides, the lengths of the sides, and the type of polygon:

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());

When creating an instance of the object I receive a stack overflow error:

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

why would I be getting an error like this?

  • You're calling the setter in the setter: `set sideLengths(sideLens=[]){ if (sideLens.length == 0) return undefined; this.sideLengths = sideLens; <-- this calls "set sideLengths" }` – Heretic Monkey Apr 23 '21 at 19:18

1 Answers1

0

Setter is special function that handles assignment. You code is equivalent to following function call.

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

It recursively calls itself, thus the call stack overflow.

If you wanna save the value somewhere, the conventional way is to save it with a underscore prefixed property of the same name.

set sideLengths(sideLens=[]){
    if (sideLens.length == 0) return undefined;
    this._sideLengths = sideLens;
}
hackape
  • 18,643
  • 2
  • 29
  • 57