2016-09-22 3 views
2

Der folgende Code ist korrekt kompiliert und wird von ts-node ausgeführt.In Typescript was ist Array als Funktionsname?

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

let c = new C(); 

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

Aber ich verstehe nicht, die folgenden als Klasseneigenschaft.

Ich denke, es beinhaltet ein Konzept der berechneten Eigenschaft, aber ich verstehe diese Syntax nicht.

Frage 1:

[ "abc"] ist ein Array mit einem Schnurelement bei Index 0. Wenn man sich eine Funktionsdefinition hinzufügen, dann [ "abc"]() {}, dann was ist es dann? Wie könnten Sie ein Array als Funktionsname verwenden?

Frage 2:

warum nicht die folgende Art und Weise das Element Methode aufzurufen?

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

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

+1

@SLaks danke! Dies ist das Konzept, das ich vorher nicht kannte. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#Computed_property_names –

Antwort

1

Genau wie foo['bar'] und foo.bar sind gleichwertige Möglichkeiten, ein Objekt Mitglied zuzugreifen, können Sie die Indexer Syntax mit ['bar'] innerhalb object initializers und Klassendefinitionen verwenden können.

Für Ihr Beispiel, in dem die unbewegliche statisch zur Compile-Zeit bekannt ist, bedeutet dies bieten Ihnen nicht wirklich keinen Vorteil, da es die folgenden direkt äquivalent ist:

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

Allerdings ist der Indexer Syntax erlauben Sie ein paar Dinge, die sonst nicht möglich wären.

Zum Beispiel können Sie Mitgliedsnamen verwenden, die keine gültigen Bezeichner sind, z. Namen, die mit einer Zahl beginnen, oder haben einen Strich innen:

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

Es erlaubt Ihnen auch dynamisch den Mitgliedsnamen angeben, indem er von einer Variablen unter:

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

Dies gilt auch für die verwendet wird, Symbols in JavaScript, die eine Möglichkeit bieten, Elemente auf Objekten zu definieren, die nicht frei sichtbar sind, sondern nur mit direktem Zugriff auf das gleiche Symbolobjekt zugänglich sind. Dies wird letztendlich neue High-Level-Funktionalität ermöglichen, wie Symbol.iterator für das Iterieren von benutzerdefinierten Typen.

0

warum nicht die folgende Art und Weise die Member-Methode

Yup aufzurufen, die empfohlen werden würde. Aber wenn Sie wollen Leistung etwas durch Konfiguration (nicht statisch) z. eine Zeichenfolge vom Server können Sie die Indexer-Syntax verwenden.