2015-02-12 2 views
3

Я пишу класс ES6 с использованием компилятора 6to5. У меня довольно простой класс, который вызывает new Date() в функции setter и, к сожалению, приводит к исключению Chrome maximum callstack exceeded и too much recursion в FireFox.6to5 es6 класс, новый Date() триггеры превышают максимальный столбец

Я не уверен, что со следующей схемой, но называть new Date() является причиной исключения:

class DateTime { 
    constructor() { 
    this.active = null 
    } 

    set active() { 
    this.active = new Date() 
    } 

    get active() { 
    return this.active 
    } 

} 

new DateTime() 
+0

Можете ли вы опубликовать скомпилированный код? – Bergi

+0

@ Bergi Я понял это и ответил. Я новичок в ES6, это, вероятно, распространенная ошибка для новичков. – BradGreens

+1

О, неважно, я должен был это увидеть. Присвоение самому себе одного и того же свойства в сеттере было распространенной ошибкой и в ES5 :-) – Bergi

ответ

3

Похоже собственности this.active был на самом деле само упоминание о методе сеттера. Исправленный код выглядит следующим образом:

class DateTime { 
    constructor() { 
     this._active = null 
    } 

    set active(date) { 
     this._active = new Date(date || Date.now()) 
    } 

    get active() { 
     return this._active 
    } 

    toString() { 
     return this._active.toString() 
    } 

    } 

new DateTime() 

В основном, назначаяthis.active в инкубаторе в контексте ES6 будет вызывать сеттер снова прежде, чем собственность может быть назначена. Когда сеттер вызывается снова, это становится рекурсивным событием.

+0

Не обязательно * используя * it, но * assiging * to this - обратите внимание на '=' в 'this.active = ...': -) – Bergi

+0

Хороший звонок, обновил мой пост. Спасибо, я не использовал классы в контексте ES5, я полагаю, что было бы более просто, чтобы столкновения возникали при использовании конструкторов, потому что вы могли бы _see_ точные свойства на 'this' на виду. Если это имеет смысл. – BradGreens

+2

О, создание бесконечной рекурсии было так же просто, как «var obj = {set active (x) {this.active = x; }}; obj.active = 0; ';-) – Bergi

Смежные вопросы