2015-07-13 3 views
5

У меня есть класс ES6 в экземпляр переменной от вызова функции, но проблема в том, что, кажется, что функция работает, прежде чем конструктор экземпляра и выдаст ошибку:Js функции конструктора класса ES6 работать до конструктора экземпляра

constructor() { 
    this.userSelections = { 
     types : this.getTypes(), 
     providers: this.getProvider() 
    } 
    } 

getProvider() { 
    // here its throw error that this.userSelections is undefined 
    var activeType = this.userSelections.types.some((type) => { 
     return type.active; 
    }); 

    } 

В чем проблема и как я могу справиться с этой ситуацией?

ответ

5

Проблема не имеет ничего общего с классами ES6 или Babel. Вот упрощенная версия вашей проблемы:

var foo = { 
    bar: 42, 
    baz: foo.bar * 2 
}; 

Это выдаст ошибку, потому что foo еще не инициализирован в данный момент foo.bar осуществляется доступ.

В вашем случае, вы звоните getProviderво время создания объекта, который вы хотите присвоить this.userSelections. this.userSelections или его значение еще не существует, оно все еще строится.

Вы можете инициализировать значение в два этапа:

this.userSelections = { 
    types: this.getTypes() 
}; 
// now that `this.userSelections` exists, we can call `this.getProvider` without problems 
this.userSelections.providers = this.getProvider(); 

или реорганизовать код так, что getProviders принимает types в качестве параметра, может быть что-то вроде:

class Foo { 
    constructor() { 
    let types = this.getTypes(); 
    this.userSelection = { 
     types, 
     providers: this._getProvider(types) 
    }; 
    } 

    _getProvider(types) { 
    var activeType = types.some((type) => { 
     return type.active; 
    }); 
    // ... 
    } 

    getProvider() { 
    return this._getProvider(this.userSelection.types); 
    } 
} 
+0

Его 'this' ссылок на' userSelections 'объект. Он вызывает 'getProviders' на объекте' userSelections'. –

+2

@ DanPantry: Нет, нет. Это не так, как работают объектные литералы. –

+0

Моя ошибка. Я не знаю, почему, но я забыл, что конструктор создает контекст выполнения. –

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