2017-11-01 3 views
1

Zum ersten Mal etwas wie this in Node.js zum Deklarieren von Funktionen zu sehen. Kurz ist der Code ähnlich wie dieseWie funktioniert die Funktionsdeklaration durch eckige Klammern in Node.js/Javascript?

'use strict'; 
const Actions = { 
    ONE: 'one', 
    TWO: 'two', 
    THREE: 'three' 
}; 
class FunMap { 

    run(action) { 
    const map = this; 
    map[action](); 
    } 

    [Actions.ONE]() { 
    console.log("Performing action one"); 
    } 

    [Actions.TWO]() { 
    console.log("Performing action two"); 
    } 

    [Actions.THREE]() { 
    console.log("Performing action three"); 
    } 

} 

var funMap = new FunMap(); 
funMap.run('one'); 
funMap.run('two'); 
funMap.run('three'); 

Das obige Programm

gedruckt wird
Performing action one 
Performing action two 
Performing action three 

Gibt es einen technischen Namen für diese Art der Funktionsdeklaration in Node.js/Javascript?

Wie fügt diese Zeile all diese (Funktionen, die durch die Verwendung der eckigen Klammern mit einer Zeichenkettenkonstante deklariert sind) in Eigenschaftsfunktionen des FunMap-Objekts ein?

const map = this; 

Ist die eckigen Klammern Notation [] in einer JavaScript-Klasse verweist auf die Klasse selbst?

Antwort

4

Die Syntax mit eckigen Klammern in der Klasse heißt computed property name. Der Ausdruck innerhalb der eckigen Klammern wird ausgewertet, und der Stringwert des Ergebnisses wird als Schlüssel verwendet.

Der Code innerhalb der eckigen Klammern kann nicht auf die Klasse selbst zugreifen, da sie vor der Klassendeklaration ausgewertet wird.

Ihr Beispiel wird eine Klasse, die wie folgt aussieht:

class FunMap { 

    run(action) { 
    const map = this; 
    map[action](); 
    } 

    one() { 
    console.log("Performing action one"); 
    } 

    two() { 
    console.log("Performing action two"); 
    } 

    three() { 
    console.log("Performing action three"); 
    } 

} 

Die run Funktion verwendet eckige Klammern in einer anderen Art und Weise - eine Eigenschaft von Namen nachzuschlagen. Die Linie const map = this tut nichts Besonderes - die Funktion die gleiche Sache wie dies tun würde:

run(action) { 
    return this[action](); 
} 

this[action] bedeutet „die Eigenschaft action von this genannt bekommen“. Dieser Wert wird dann als Funktion ohne Argumente aufgerufen.

Berechnete Eigenschaftsnamen wurden in ES2015 hinzugefügt. Die Subscript-Syntax zum Abrufen eines Objekts nach seinem Namen war von Anfang an Teil von JavaScript.

+0

Kann ich etwas anderes als eine Zeichenkette konstant in [] setzen? Ist die Antwort auf meine letzte Frage ein NEIN? Bezieht sich die eckige Klammernnotation [] in einer JavaScript-Klasse auf die Klasse selbst? –

+0

Sie können jeden Ausdruck in die Klammern setzen (versuchen Sie '[" f "+ 1]() {}'), und die Antwort ist nein - der Code in den eckigen Klammern wird ausgeführt, bevor die Klasse definiert wird. – joews

+0

Muss ein Ausdruck in den Klammern eine Zeichenfolge zurückgeben? –

Verwandte Themen