2016-09-22 12 views
2

以下のコードはts-nodeによって正しくコンパイルされ、実行されます。Typescriptでは配列は関数名とは何ですか?

class C { 
    ["abc"]() { 
     return "C"; 
    } 
} 

let c = new C(); 

let className = c["abc"](); 
console.log(className); 

しかし、私はクラスプロパティとして次のことを理解していません。

["abc"]() {} 

計算されたプロパティの概念が含まれていると思いますが、この構文はわかりません。

質問1:

[ "ABC" は]は[ "ABC"](){}、次いで、その周り関数定義を追加した場合はインデックス0に1つの文字列の要素を持つ配列でありますそれは何ですか?どのように配列を関数名として使用できますか?

質問2:

メンバーメソッドを呼び出すための理由ではない、以下の方法はありますか?

c.["abc"](); 
+3

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer – SLaks

+1

@SLaksありがとう!これは以前私が知らなかった概念です。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#Computed_property_names –

答えて

1

あなたはobject initializersとクラス定義内['bar']とインデクサ構文を使用することができ、オブジェクトのメンバにアクセスするための同等の方法です。プロパティは静的にコンパイル時に知られている、それは次のように直接同等なので、これは本当に、あなたにどんな利点を提供していませんあなた例えば

、:

class C { 
    abc() { 
     return "C"; 
    } 
} 

しかし、インデクサ構文を許可しませんそれ以外の方法ではできないことがいくつかあります。

たとえば、有効な識別子ではないメンバー名を使用できます。数字で始まる名前、または内部のダッシュを持っている:

class C { 
    ['123foo']() { … } 
    ['foo-bar']() { … } 
} 

それはまた、あなたが動的変数からそれを取ることによって、メンバー名を指定することができます:

let memberName = 'foo'; 
class C { 
    [memberName]() { return 'bar'; } 
} 
console.log(new C().foo()); // bar 

これはためにも使用されていますSymbolsをJavaScriptで使用すると、自由に表示されずに同じシンボルオブジェクトに直接アクセスできるオブジェクト上のメンバーを定義することができます。これにより、最終的にカスタムタイプを反復するためのSymbol.iteratorのような新しい高レベル機能が可能になります。

0

推奨されるだろうメンバメソッド

うんを起動する理由はない、次のよう。しかし、の電力(静的ではない)で何かをしたい場合。サーバーからの文字列、インデクサー構文を使用できます。ただ、foo['bar']foo.barなどの

関連する問題