2017-09-18 15 views
1

私はJavaScriptには新しく、演習では少し反応していますが、私は奇妙な問題を抱えています。私は同じクラスの別のメソッドの中でメソッドを呼び出そうとしていますが、それは必ずしも機能しません。メソッドエラーからメソッドを呼び出す "Xは関数ではありません"

export class Core { 
constructor() { 
    this.promptList = ["Are you sure you want to proceed? [Y/n] ", 
         "Enter a username: ", 
         "Enter your email: "]; 
    this.funcList = [this.proceed, 
        this.validateUser, 
        this.validateEmail]; 

    this.currentStep = 0; 
} 

incStep(state) { 
    const newState = Object.assign({}, state, 
     {prompt: this.promptList[++this.currentStep]}); 
    return newState; 
} 

printError(state, error) { 
    console.log("error"); 
    return Object.assign({}, state, 
     {history: state.history.concat(error)}); 
} 

proceed(input, state) { 
    if (input == "Y") 
     return this.incStep(state); 
    else if (input == "n") 
     return this.printError(state, "ok bye"); 
    return state; 
} 

validateUser(input, state) { 
    return state; 
} 

validateEmail(input, state) { 
    return state; 
} 

process(input, currentState) { 
    const newState = Object.assign({}, currentState, 
     {history: currentState.history.concat(input)}); 
    return this.funcList[this.currentStep](input, newState); 
} 

}過程で

は()、私は機能のリストからメソッドを呼び出し、これが正常に動作しますが、私は進んでからincStepを()()を呼び出すしようとすると、エラーがスローされ

/

は、私がここで間違って何をやっている:

Uncaught TypeError: this.incStep is not a function 
at Array.proceed (http://localhost:8080/index_bundle.js:31881:34) 
at Core.process (http://localhost:8080/index_bundle.js:31898:42) 

私はエラーが「これは」良いオブジェクトを参照していないという事実によるものであるが、この場合には、なぜ私は正確に理解していないことを推測しています?

+0

どのように 'process()'を呼びますか?あなたは 'proceed()'をどのように呼びますか? – bennygenel

+0

@bennygenel process()は別のクラスから呼び出され、proceed()はコード –

+0

の最後の行で呼び出されます – bennygenel

答えて

2

あなたのコードはこれらの部分のために失敗しています。それは

関数はオブジェクトのメソッドとして呼び出され
this.functList = {0:refrence of proceed, 
        1:refrence of validateUser, 
        2:refrence of validateEmail, 
        length:3 
        } 

同等あるので、あなたは、配列を覚えておく必要が

this.funcList = [this.proceed, 
       this.validateUser, 
       this.validateEmail]; 

はJSでオブジェクトのspeacial一種である、それはこのだですメソッドが呼び出されるオブジェクトに設定されます。

this.funcList[this.currentStep](input, newState); 

が呼び出され、実行された進行した場合 だから、これは、この場合にfuncList配列たが常駐オブジェ、に属していました。

proceed(input, state) { 
if (input == "Y") 
    return this.incStep(state); 

したがって、proceed内のこの呼び出しは、クラスではなく、funclist配列を参照し、失敗します。

バインドを使用してをバインドすると、がこれを解決する1つの方法です。

this.funcList = [this.proceed.bind(this), 
       this.validateUser.bind(this), 
       this.validateEmail.bind(this)]; 
関連する問題