2016-04-06 7 views
2

ECMA6で矢印関数(内部的)を使用し、 "this"(コンテキスト)を保持する必要があります。だから、コンテキスト "this"はオブジェクトメソッドで保持されていません

: "未定義のプロパティ 'methodOne'(...)を読み取ることができませんキャッチされない例外TypeError"、どちらか私は(クロム、FF)不正またはブラウザの仕様を理解し、nodejsはない しかし

class Foo { 
    methodOne() { 
     console.log("MethodOne is called") 
    } 

    methodTwo() { 
     console.log("MethodTwo is called"); 
     this.methodOne(); 
    } 
} 

var foo = new Foo(); 

var executing = function (someMethod) {someMethod()}; 

executing(foo.methodTwo) 

それはエラーが発生しますこれはまだサポートしていますか?

+1

_「『は、この』(コンテキスト)が保持されなければなりませんか」?なぜES6で変わったのでしょうか? – zeroflagL

+0

矢印機能とメソッド定義は、2つの異なるものです。 –

答えて

3

ES6のクラスは、プロトタイプの継承よりも構文上の砂糖です。このようにして、クラスのメソッド宣言はprototypeオブジェクトにアタッチされます。

1)この例の問題は、関数が呼び出される方法にあります。コンテキストthisを保つために、あなたはまだオブジェクト上のメソッドとしてそれを呼び出すためにを必要とする:

var foo = new Foo(); 

var executing = function (someMethod, context) {someMethod.apply(context)}; 

executing(foo.methodTwo, context); 

2)しかし、あなたはとして通常の関数それを呼び出す場合は、undefinedとしてこれを持っていますstrictモードで:

:関数呼び出しの

methodTwo() { 
     console.log("MethodTwo is called"); 
     this.methodOne(); // <---- `this` is `undefined` 
} 

thisが呼び出された方法によって決定されますオブジェクトのメソッドとしてsomeMethod();又はvar m = foo.methodTwo; m();

  • this対象となる):正規関数(非厳密モードでundefinedまたはグローバルオブジェクトとしてthisを行う)として
    1. foo.methodTwo()
    2. コンストラクタとしては、(thisを行いますnew Foo()
    3. 間接呼び出し(apply(newContext)call(newContext)を使用して):someMethod.apply(context)を呼び出します。

    bound()メソッドは、呼び出し前にコンテキストを変更できることに注意してください。それは、ケース1、2、および4の呼び出しで、後のコンテキスト変更を取り消します。コンストラクター呼び出しの場合、バインドされたコンテキストは無視され、新しく作成されたオブジェクトが引き続き使用されます。

    this nice postには、JavaScriptの関数コンテキストと呼び出しについてチェックします。

  • +0

    後者の場合、グローバルオブジェクトではなく、定義されていませんか? – RemcoGerlich

    +1

    @RemcoGerlich厳密なモードでは、非厳密なグローバルオブジェクトでは未定義です。 –

    +0

    @DmitriPavlutin 'foo.method'と呼んでいればどうやって未定義になるのですか? –

    1

    So, either I understood specification incorrect or browsers (Chrome, FF) and nodejs does not support this yet?

    あなたが読んだ仕様のどの部分が間違っていたか。メソッドと矢印関数は2つの異なるものです。たとえメソッドに矢印関数のセマンティクスがあっても、矢印関数はthisをレキシカルで解決するので、期待した動作を得ることはできません。

    いいえ、メソッドは通常の関数宣言/式wrtからthisのように機能します。

    も参照してください_「矢印機能(内部)を使用しています」または_ _のような仕様で、それが何かを言うんHow to access the correct `this` context inside a callback?

    +0

    あなたは正しいです。私はスペックをもう一度読んで、それは私にとってはっきりしています。 – vmusulainen