2017-02-15 12 views
1

私はnode.jsを初めて使用しており、クラスを要求しようとしています。私は参考としてhttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classesを使用しました。私は例のためにこれを行うときしかし、:app.jsがelectron.jsレンダラプロセスがあることを指摘しておかなければ未知の型エラー:this.methodは関数ではありません - ノードjsクラスのエクスポート

talker.js:4 Uncaught TypeError: this.say is not a function

、それはrollup.js

を使用してバンドルさ:

// talker.js 
class Talker { 
    talk(msg) { 
     console.log(this.say(msg)) 
     var t = setTimeout(this.talk, 5000, 'hello again'); 
    } 
    say(msg) { 
     return msg 
    } 
} 
export default Talker 

// app.js 
import Talker from './taker.js' 
const talker = new Talker() 
talker.talk('hello') 

私が取得します

これはなぜでしょうか?

更新:申し訳ありませんが、私は擬似コードを入れるときに行を追加するのを忘れました。私がsetTimeoutとコールバックすると実際に起こります。私はコードを更新しました。

+0

'console.log(this)'は 'talk()'に何を表示しますか? – Ryan

+0

'' 'Talker {} __proto__ : オブジェクト' '' – CUGreen

+0

エクスポートとインポートの行なしで1つのファイルでコードを実行すると問題なく動作します。 – RobG

答えて

1

あなたの方法にthisのバインドを失っています。このことから

変更:これに

setTimeout(this.talk, 5000, 'hello again'); 

setTimeout(this.talk.bind(this), 5000, 'hello again'); 

あなたが関数の引数としてthis.talkを渡し、それがthisを取り、方法talkを検索し、参照を渡します。その機能にしかし、それはその関数への参照だけを渡します。 thisにあるオブジェクトとの関連はもうありません。 .bind()は、thisを追跡し、say()というだけでなく、this.say()と呼ばれる小さなスタブ関数への参照を渡すことができます。

あなたはこのやった場合は、同じものを見ることができます:

const talker = new Talker();' 

const fn = talker.say; 
fn(); 

fnにメソッドを割り当てることで、すべてのそれとtalkerへの関連付けを取らないので、これは同じ問題を生成します。これは、オブジェクトとの関連付けを行わない単なる関数参照です。事実:何.bind()

talker.say === Talker.prototype.say 

は、オブジェクトの値を保存し、その後、そのオブジェクトを使用してメソッドを呼び出します小さなスタブ関数を作成することです。

+0

素晴らしい、ありがとう:-) – CUGreen

関連する問題