ES6ゲッター/セッター、アロー機能付き


100

私はbabel6を使用しており、ペットプロジェクトでは、使用できるメソッド用にXMLHttpRequestのラッパーを作成しています。

open = (method, url, something) => {
  return this.xhr.open(method, url, something);
}

しかし、プロパティの場合、矢印関数は機能しません

これは機能します:

get status() { return this.xhr.status; }

でも使えない

get status = () => this.xhr.status;

これは意図的なものですか?


中括弧や改行は必要ありません。あなたはただ言うことができます(method, url, something) => this.xhr.open(method. url, something)

getオブジェクトリテラルまたはクラス定義の一部ですが、変数の割り当てはありません。なぜ同じように機能する必要があると思いますか?
Bergi、

1
status => this.xhr.status(c#7構文)またはおそらくget status() => this.xhr.status読みやすさのために素晴らしい構文の砂糖でしたが、TypescriptではなくJavascriptは(まだ?)サポートしていません
Charles HETIER

回答:


109

ES2015の文法によれば、オブジェクトリテラルのプロパティは、次の4つのうちの1つのみです。

PropertyDefinition

  • IdentifierReference
  • PropertyName : AssignmentExpression
  • MethodDefinition

先行を許可するこれらのタイプの唯一の1つgetMethodDefinitionです。

MethodDefinition

  • PropertyName ( StrictFormalParameters ) { FunctionBody }
  • GeneratorMethod
  • get PropertyName ( ) { FunctionBody }
  • set PropertyNamePropertySetParameterList ) { FunctionBody }

ご覧のgetとおり、フォームは非常に限定された文法に従っており、フォームは

get NAME () { BODY }

文法では、次の形式の関数は許可されていませんget NAME = ...


あなたの助けをありがとう、私はあなたの答えを受け入れます。ゲッター/セッターが割り当てで使用できないことが定義されている場所を知っていますか?ちょっと興味があるんだけど。
Gabor Dolla

@GaborDolla ECMAScript仕様のオブジェクトリテラル文法を参照するように編集されました。
アプシラー2015年

35

受け入れられた答えは素晴らしいです。コンパクトな「矢印関数構文」ではなく、通常の関数構文を使用する場合に最適です

しかし、多分あなたは本当にアロー関数が好きです。通常の関数構文では置き換えられない別の理由アロー関数を使用している可能性があります。別のソリューションが必要になる場合があります。

たとえば、OPがを使用thisしていることに気づきました。字句的バインドしthisたい場合があります。別名「これの非バインディング」)、および矢印関数はその字句バインディングに適しています。

このObject.defineProperty手法を使用しても、ゲッターでアロー関数を使用できます。

{
  ...
  Object.defineProperty(your_obj, 'status', { 
     get : () => this.xhr.status 
  });
  ...
}

参照はの言及object initialization(通称get NAME() {...}defineProperty(通称get : ()=>{}。少なくとも1つの重要な違いdefinePropertyがあります。使用するには、変数がすでに存在している必要があります。

既存のオブジェクトのゲッターを定義する

つまり、(私の例では)存在し、変数に保存されているObject.definePropertyことを確認する必要your_objがあります(object-initializationオブジェクトの初期化でオブジェクトリテラルを返すことができます:) {..., get(){ }, ... }。詳細はObject.defineProperty具体的には、ここに

Object.defineProperty(...)get NAME(){...}構文に匹敵するブラウザーサポートがあるようです。最新のブラウザ、IE 9。


10
賢い、それははるかに冗長なだけよりも、最終的には:get status() { return this.xhr.status; }
devuxer

2
@devuxer冗長すぎることに同意します。しかし、明確にするために、あなたはあなたが定義されているオブジェクトでthis なければなりませんget status() { ... }。しかし 字句バインディングの違いにより、私this 別の何かになる可能性がありますよね?
赤エンドウ

2
同意します...実際には、私はthisgetアクセサーに必要なケースに遭遇していません。(thisイベントハンドラーやコールバックのように、関数を渡すときに、矢印関数のバインドの利点が
効くよう

3
私は頻繁に脂肪矢印+字句バインディングを使用し、同意()=>{}私はに渡すコールバックのために約束のように、$http(...).then((promise_result)=> this...}))。fat-arrowを使用しない場合thisは、グローバルWindowオブジェクトを表します。あまり役に立たない。しかし、私がめったに(決して?)()=>{}あなたが言うように「getアクセサ」の関数として使用したことはありません...少なくともthis内部は定義さget()れているオブジェクトを表します脂肪矢印機能)!get()Window
赤エンドウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.