Что я сделал не так с созданием объекта ошибки «Uncaught RangeError: Превышен максимальный размер стека вызовов» и как ее избежать? - PullRequest
0 голосов
/ 05 января 2019

Не могу понять, почему появляется сообщение «Uncaught RangeError: Превышен максимальный размер стека вызовов». Я пытаюсь решить:

Проблема:

Создайте объект Polygon для создания экземпляра нового Polygon, который будет выводить на консоль текст, основанный на количестве сегментов, из которых составлен . Полигон имеет одно свойство segments, в котором хранится это значение , и к нему можно получить доступ через функцию getSegments().

По умолчанию имеет 3 сегмента.

Если сегменты строго меньше 3, то Polygon установит их на 3 и выдаст сообщение об ошибке, говорящее: «Полигон должен иметь 3 сегмента, это будет установлено на 3 ".

Случаи:

1. Если сегменты не определены, имя многоугольника - треугольник
2. Если сегменты <3, имя многоугольника устанавливается на треугольник </em>
3. Если сегментов 3, имя многоугольника устанавливается в треугольник
4. Если сегменты равны 4, имя многоугольника устанавливается на четырехугольник
5. Если сегменты 5, имя многоугольника устанавливается на пятиугольник
6. Если сегментов 6, имя многоугольника устанавливается в шестиугольник

Что я пытался сделать?

Я попытался создать класс Polygon, а затем функцию getSegments (сегменты), чтобы изменить свойство сегментов нового объекта в зависимости от пропуска сегментов, который будет передаваться по условию, и в ситуации, когда я вызываю сценарий извне из индекса. HTML-страница, это работает. Но когда я пытаюсь вставить код в консоль браузера, и в среде Node.js я получаю сообщение об ошибке «Uncaught RangeError: Превышен максимальный размер стека вызовов». Я не сталкивался с подобной ошибкой раньше, поэтому, если бы кто-нибудь мог увидеть, что я там сделал неправильно, или знать, как объяснить мне, как этого избежать в будущем, я был бы очень признателен.

class Polygon {
    constructor () {
        this.segments = getSegments();
    }
}

function getSegments(segments) {
    this.segments = segments;
    if (segments < 3) {
        polygon = new Polygon(segments)
        console.log ('A polygon need to have at least 3 
segments. It will be set to 3.')
        polygon.segments = 3
    } else if (segments === 3) {
        polygon = new Polygon(segments)
        console.log ('The polygon name is triangle')
    } else if (segments === 4) {
        polygon = new Polygon(segments)
        console.log ('The polygon name is quadrilateral')
    } else if (segments === 5) {
        polygon = new Polygon(segments)
        console.log ('The polygon name is pentagon')
    } else if (segments === 6) {
        polygon = new Polygon(segments)
        console.log ('The polygon name is hexagon')
    } else if (typeof segments == 'undefined') {
        polygon = new Polygon(3)
        console.log ('The polygon name is triangle')
    }
}

Результаты:

Я ожидал, что получится вывод:

getSegments(4) // -> объект многоугольника со свойством сегментов, его значением 4 и текстом console.log Имя многоугольника является четырехугольным.

Фактический вывод: Uncaught RangeError: Превышен максимальный размер стека вызовов.

Заранее благодарю за все ваши советы и помощь.

Решение

На самом деле проблема была в этом блоке кода:

`class Polygon {
        constructor () {
            this.segments = getSegments();
        }
    }`

строка кода, которую нужно заменить:

`this.segments = segments`and with constructor we need to pass segments like this `constructor (segments)`, and the error is resolved.

1 Ответ

0 голосов
/ 06 января 2019

Вы должны решить, будете ли вы создавать Polygon и затем выяснить, сегменты или getsegments будет фабрикой, которая делает Polygon экземпляров. Выполнение обоих приводит к бесконечному циклу.

Вот одна идея, которая упрощает использование метода в классе Polygon. Затем вы можете вызвать его в конструкторе для настройки экземпляра полигона:

let types = ['triangle', 'quadrilateral', 'pentagon', 'hexagon']

class Polygon {
    constructor (n) {
         // call instance method that will set type
         // an hanlde out of range segment
        this.setType(n)
    }
    setType(segments) {
        // handle bad segment lengths
        if (!segments || segments < 3) {  
            console.log ('A polygon need to have at least 3 segments. It will be set to 3.')
            segments = 3
        }
        if (segments > 6){
            console.log("Unknown polygon, setting segments to 6")
            segments = 6
        }
        // setProps
        // array index starts at zero; subtract three to make 
        // segments of 3 map to array index 0 
        this.type = types[segments - 3]
        this.segments = segments
    }
}


console.log(new Polygon(2))
console.log(new Polygon(3))
console.log(new Polygon(4))
console.log(new Polygon(5))
console.log(new Polygon(6))
console.log(new Polygon(7))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...