2014-03-24 7 views
43

ich mit dem neuen ES6 Template Literals Funktion und das erste, was ich spielen, die mir in den Kopf kam, war ein String.format für Javascript, damit ich über die Implementierung eines Prototyps ging:Aufschieben Ausführung für ES6 Vorlage Literale

String.prototype.format = function() { 
    var self = this; 
    arguments.forEach(function(val,idx) { 
    self["p"+idx] = val; 
    }); 
    return this.toString(); 
}; 
console.log(`Hello, ${p0}. This is a ${p1}`.format("world", "test")); 

ES6Fiddle

Allerdings wird das Vorlagen-Literal vor ausgewertet, es wird an meine Prototyp-Methode übergeben. Gibt es eine Möglichkeit, den obigen Code zu schreiben, um das Ergebnis zu verschieben, bis ich die Elemente dynamisch erstellt habe?

+0

Wo ausgeführt werden Sie das? Keine der neuesten JS-Implementierungen haben dies nicht implementiert, denke ich. – thefourtheye

+0

@thefourtheye In der ES6Fiddle, verknüpft mit in der Frage – CodingIntrigue

+0

Ich denke für eine '.format()' Methode sollten Sie nicht eine Vorlage Zeichenfolge, sondern ein einfaches String-Literal. – Bergi

Antwort

56

kann ich drei Möglichkeiten, um dieses sehen:

  • Vorlage verwenden Strings wie sie entworfen wurden verwendet werden, ohne format Funktion:

    console.log(`Hello, ${"world"}. This is a ${"test"}`); 
    // might make more sense with variables: 
    var p0 = "world", p1 = "test"; 
    console.log(`Hello, ${p0}. This is a ${p1}`); 
    // or even function parameters for actual deferral of the evaluation: 
    const welcome = (p0, p1) => `Hello, ${p0}. This is a ${p1}`; 
    console.log(welcome("world", "test")); 
    
  • keine Vorlage Zeichenfolge Verwenden Sie , aber ein einfaches String-Literal:

    String.prototype.format = function() { 
        var args = arguments; 
        return this.replace(/\$\{p(\d)\}/g, function(match, id) { 
         return args[id]; 
        }); 
    }; 
    console.log("Hello, ${p0}. This is a ${p1}".format("world", "test")); 
    
  • Verwenden Sie ein getaggtes Vorlagenliteral. Beachten Sie, dass die Ersetzungen weiterhin ausgewertet werden, ohne dass der Handler sie abfängt. Daher können Sie keine Identifikatoren wie p0 verwenden, ohne eine so benannte Variable zu haben. Dieses Verhalten kann sich ändern, wenn ein different substitution body syntax proposal is accepted (Update: es war nicht).

    function formatter(literals, ...substitutions) { 
        return { 
         format: function() { 
          var out = []; 
          for(var i=0, k=0; i < literals.length; i++) { 
           out[k++] = literals[i]; 
           out[k++] = arguments[substitutions[i]]; 
          } 
          out[k] = literals[i]; 
          return out.join(""); 
         } 
        }; 
    } 
    console.log(formatter`Hello, ${0}. This is a ${1}`.format("world", "test")); 
    // Notice the number literals:^   ^
    
+1

Der Lambda-Ausdruck ist eine gute Idee! – Nock

+0

Ich mag das, weil es Ihnen erlaubt, die Werte zu manipulieren, bevor sie interpoliert werden. Wenn Sie zum Beispiel ein Array von Namen übergeben, können Sie sie geschickt in Zeichenfolgen wie "James", "James & Mary" oder "James, Mary & William" kombinieren, abhängig davon, wie viele sich in dem Array befinden. –

+0

Dies könnte auch als statische Methode zu String wie 'String.formatter' hinzugefügt werden. –