2017-12-22 9 views
0

私はこのlinkからES6の注釈に従っていて、再生するための小さなコードスニペットを作成しました。JavaScriptのプロトタイプ関数NANを返します

class Bar{ 
    constructor(x,y){ 
     this.x = x; 
     this.y = y; 
    } 
} 
let bar = new Bar(12,10); 
Bar.prototype.foo =function(){ 
    return this.x + this.y; 
} 
bar.foo() // 22 correct 

私はこれを行うまでとても幸せです。

let baz = bar.foo 
baz(); // NaN 

バズ()ははNaNを印刷しているのはなぜ?

+0

バズ() '' bar'(または 'X'と 'y'特性を有する任意のオブジェクト)に関数を呼び出していない – Bergi

+0

は私の質問にすべての修正を提案してください'のでテキスト。あまりにも一般的なように見える –

+2

[この "キーワードはどのように機能しますか?](https://stackoverflow.com/q/3127429/218196) –

答えて

2

bar.fooに影響を与えると、関数はそのコンテキスト(this)を失います。それでは、これ以上はありません..xとthis.y.ブレークポイントでチェックすると、両方が未定義であることがわかります。

したがって、未定義の2つを加算すると、NaNが生成されます。

お使いのブラウザでチェックあまりにもこれを試してみてください:

class Bar{ 
    constructor(x,y){ 
     this.x = x; 
     this.y = y; 
    } 
} 
let bar = new Bar(12,10); 
Bar.prototype.foo =function(){ 
    debugger; 
    return this.x + this.y; 
} 

そのコンテキストを定義し、それを呼び出すようにしてください。それを行う3つの方法:

let baz = bar.foo.bind(bar); 
baz(); 

bar.foo.call(bar); 

bar.foo.apply(bar); 
3

オブジェクトから別の機能を使用し、thisが不足しています。その作業を行うには、関数へのオブジェクトbindが必要です。

class Bar{ 
 
    constructor(x,y){ 
 
     this.x = x; 
 
     this.y = y; 
 
    } 
 
} 
 
let bar = new Bar(12,10); 
 
Bar.prototype.foo =function(){ 
 
    return this.x + this.y; 
 
} 
 
console.log(bar.foo()) // 22 correct 
 

 
let baz = bar.foo.bind(bar); // bind innstance 
 

 
console.log(baz()); // 22

関連する問題