ES6オブジェクトのメソッド:矢印関数の使用


96

ES6では、これらは両方とも合法です。

var chopper = {
    owner: 'Zed',
    getOwner: function() { return this.owner; }
};

そして、速記として:

var chopper = {
    owner: 'Zed',
    getOwner() { return this.owner; }
}

新しい矢印機能も使用できますか?のようなことを試みることで

var chopper = {
    owner: 'John',
    getOwner: () => { return this.owner; }
};

または

var chopper = {
    owner: 'John',
    getOwner: () => (this.owner)
};

メソッドがにアクセスできないことを示唆するエラーメッセージが表示されthisます。これは単なる構文の問題ですか、それともES6オブジェクト内でファットパイプメソッドを使用できませんか?


11
新しい関数構文の最大のポイントの1つは、処理がthis異なることです。これは、関数が作成された字句環境によって定義されthisます。つまり、chopper変数を作成するthis値が関数の値になります。つまり、chopperオブジェクトを参照することはありません。

1
太い矢印の構文を使用している間?this最初にchopperオブジェクトを作成し、次にthisそのオブジェクトを指す関数で割り当てを行うことによって値を変更する場合のみ。これは、コンストラクター関数を使用してかなりきれいに実行できます。

1
このデモはFirefoxで実行されます。Chromeにはまだありません。jsfiddle.net/bfyarxfe

2
@fox、そのjsfiddleで「usestrict」を使用する必要があります。
Walter Chapilliquen-wZVanG 2015年

1
@fox:サポートされている環境では正常に動作します。Firefoxはまだ完全にサポートされていません。Continuumconsole.log()メソッド呼び出しの結果で試してみてください。できます。

回答:


154

矢印関数は、単に昔ながらの関数の短いバージョンとしてすべての状況で使用されるように設計されているわけではありません。これらは、functionキーワードを使用して関数構文を置き換えることを意図したものではありません。矢印関数の最も一般的な使用例は、再定義thisされない短い「ラムダ」であり、関数をコールバックとして関数に渡すときによく使用されます。

矢印関数を使用してオブジェクトメソッドを作成することはできません。これは、矢印関数thisが字句的に囲むコンテキストの近くにあるため、矢印this内がオブジェクトを定義した場所で現在のものであるためです。つまり:

// Whatever `this` is here...
var chopper = {
    owner: 'Zed',
    getOwner: () => {
        return this.owner;    // ...is what `this` is here.
    }
};

あなたの場合、オブジェクトにメソッドを書きたい場合は、単に従来のfunction構文、またはES6で導入されたメソッド構文を使用する必要があります。

var chopper = {
    owner: 'Zed',
    getOwner: function() {
        return this.owner;
    }
};

// or

var chopper = {
    owner: 'Zed',
    getOwner() {
        return this.owner;
    }
};

(そこそれらの間の小さな違いがありますが、あなたが使用している場合、彼らは唯一の重要なだsupergetOwner、あなたがされていない、またはあなたがコピーした場合getOwner、別のオブジェクトに。)

es6メーリングリストでは、構文は似ているが独自の矢印関数のねじれについていくつかの議論がありましたthis。ただし、この提案は、単なるシンタックスシュガーであり、数文字の入力を節約でき、既存の関数シンタックスに新しい機能がないため、あまり受け入れられませんでした。トピックのバインドされていない矢印関数を参照してください。


私がこれを正しく読んでいるなら、たとえそれがコードのより大きな均一性/読みやすさにつながるとしても、メーリングリストがシンタックスシュガーの優先順位を下げることを示唆しているようです。現状では、ES6のOOPコンテキストでfat-arrow関数を使用することは、たとえば、coffeescriptよりもはるかに困難です。
フォックス

私が理解しているように、シンタックスシュガー言語拡張を検討する正当な理由と考えられていますが、優先度が低いと言うように、つまり、そのような提案の基準は高くなっています。

12

この行getOwner: => (this.owner)は次のようになります。

var chopper = {
    owner: 'John',
    getOwner: () => this.owner
}; //here `this` refers to `window` object.

this関数に宣言する必要があります:

var chopper = {
    owner: 'John',
    getOwner() { return this.owner }
};

または:

var chopperFn = function(){

    this.setOwner = (name) => this.owner = name;
    Object.assign(this,{
        owner: 'Jhon',
        getOwner: () => this.owner,
    })

}

var chopper = new chopperFn();
console.log(chopper.getOwner());
chopper.setOwner('Spiderman');
console.log(chopper.getOwner());


1
ここでエラーが発生します:"TypeError: Cannot read property 'owner' of undefined\n at Object.chopper.getOwner
fox

なるほど、これは正しい使用法ですが、メソッドestaは常にウィンドウオブジェクトを返します。this関数内で宣言する必要があります。
Walter Chapilliquen-wZVanG 2015年

2
this必ずしもを参照する必要はありませんwindow。これは、現在の値がthis囲んでいる環境にあるものを指し、そうである場合とそうでない場合がありますwindow。多分それはあなたが意味したことです。それがデフォルト値ではないことを彼が理解していることを確認したいだけです。

@torazaburoそれは私にとっては問題ありません、私はそれを試しました、this今はクラスを指します
Walter Chapilliquen – wZVanG 2015年

2
あなたが書いたものは、単に書くことと同等ですが、より冗長ですvar chopperFn = function() { this.owner = 'Jhon'; this.getOwner = () => this.owner; }

1

矢印関数を使用するために従う簡単なヒント。

  • object.method()構文を使用するメソッドには、矢印以外の関数を使用します。(これらは意味のあるものを受け取る関数ですthis、呼び出し元から値。)
  • 他のほとんどすべてに矢印機能を使用します。


0

あなたは矢印の機能を使用する必要がある場合は、変更することができますthischopper

var chopper = {
  owner: "John",
  getOwner: () => chopper.owner
};

これはベストプラクティスではありませんが、オブジェクト名を変更するときは、この矢印関数を変更する必要があります。


0

厳密モードのもう1つのヒントは、this未定義ではなくウィンドウを参照しています。

  (() => {
    "use strict";
    console.log(this); // window
  })();

  (function () {
    "use strict";
    console.log(this); // undefined
  })();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.