Frage

In Anbetracht der folgenden Coffeescript-Code:

class Animal
  constructor: (@name) ->
  speak: (things) -> "My name is #{@name} and I like #{things}"

Dies erzeugt:

var Animal = (function() {
  function Animal(name) {
    this.name = name;
  }
  Animal.prototype.speak = function(things) {
    return "My name is " + this.name + " and I like " + things;
  };
  return Animal;
})();

Aber warum ist das nicht mehr idiomatische Code generiert?

var Animal = function Animal(name) {
  this.name = name;
};
Animal.prototype.speak = function(things) {
  return "My name is " + this.name + " and I like " + things;
};

Ich weiß, dass Coffee eine Menge Sachen in anonymen Funktionen Steuerungsbereich Leck Wraps, aber was hier auslaufen könnte?

War es hilfreich?

Lösung

Der generierte Code macht es möglich, haben zuverlässig genannten Funktionen im Internet Explorer. (In diesem Fall „Animal“.) Wenn Sie einfach eine benannte Funktion auf der obersten Ebene Bereich verwenden, wird es mit allen möglichen var Animal = Erklärungen in Konflikt geraten, die vorhanden sein könnten ... auch in unteren Bereichen, sie zu verhindern, dass korrekt verwiesen wird. Um Arbeit rund um den IE Fehler, schließen wir die Funktion Wrapper um die Klassendefinition.

Andere Tipps

Dies ist auf Unterstützung Backtraces einschließlich der Klassennamen und nicht nur die Funktionsnamen, wenn eine Ausnahme ausgelöst wird.

Das Verfahren Coffee hat auch Vorteile für minification.

meine andere Antwort :

Für die meisten vernünftigen Klassen, die Schließung von Coffeescript erzeugt erzeugt kleinere minified Ausgabe. Der Verschluss-Wrapper Kopf 25 Bytes minimierte ist, aber es erspart Ihnen Wiederholung der Klassenname , Speichern k * N Bytes (k = Buchstaben-in-Namen, N = num-of -refs). beispielsweise, wenn eine Klasse wie BoilerPlateThingyFactory 2+ Methoden hat, erzeugt der Verschluss wrapper kleinen minified Code.



im Detail ...

Der Kaffee generierte Code unter Verwendung eines Verschlusses minifies an:

// Uglify '1.js' = 138 bytes (197 w/ whitespace):

var Animal=function(){function e(e){this.name=e}return e.prototype.speak=function(e){return"My name is "+this.name+" and I like "+e},e}();

// with whitespace ("uglifyjs -b"):

var Animal = function() {
    function e(e) {
        this.name = e;
    }
    return e.prototype.speak = function(e) {
        return "My name is " + this.name + " and I like " + e;
    }, e;
}();

ryeguy die Alternative "idiomatische" Umsetzung minifies dazu:

// Uglify '2.js' = 119 bytes (150 w/ whitespace):

var Animal=function(t){this.name=t};Animal.prototype.speak=function(e){return"My name is "+this.name+" and I like "+e};

// with whitespace ("uglifyjs -b"):

var Animal = function(t) {
    this.name = t;
};

Animal.prototype.speak = function(e) {
    return "My name is " + this.name + " and I like " + e;
};

Beachten Sie, wie der Name "Animal" Name genau einmal in der Kaffee Form, und N = 2 mal in ryeguy des "idiomatisch" varient existiert. Now „Animal“ sind nur 6-Buchstaben, und es gibt nur ein Verfahren, so Kaffee hier von 25-6 = 19 Bytes verlieren sollte. meinen minified Code Beratung, dann ist es 138 Bytes bis 119 Bytes für ein Delta von ... 19 Bytes. In 4 weitere Methoden, und der Vorteil schaltet auf Kaffee. Und es ist nicht nur Methoden; Klasse Konstanten und andere ref Typen zählen zu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top