Umfang in Coffeescript-Klassen

9

Ich möchte eine Reihe von Funktionen innerhalb einer Klasseneigenschaft verschachteln, wie unten gezeigt.
Leider erhalten sie keinen Zugriff auf den Hauptbereich der Klasse.

Kann ich das lösen, ohne jede verschachtelte Funktion mit einem Verweis auf this ?

zu versehen %Vor%

Nicht funktionierende Alternative mit vorgeschlagenem Fettpfeil:

%Vor%

Optionale Alternative, die nicht in die globale Eigenschaft this.errors schreibt:

%Vor%     
Industrial 20.10.2012, 10:14
quelle

2 Antworten

3

In JavaScript (als Ergebnis auch CoffeeScript) verwenden Methoden this des Objekts, das die Methode enthält.

%Vor%

Dies funktioniert normalerweise gut, es sei denn, Sie behandeln ein Beispiel wie das Ihre:

%Vor%

Wenn ich mit JavaScript arbeite, würde ich keinen Namespace für Funktionen haben - es funktioniert nicht gut, auch nicht mit Workarounds. Beispielsweise könnten Sie versuchen, den Verweis auf this -Objekt in object.functions zu setzen, damit jede Funktion in object.functions darauf zugreifen kann.

%Vor%

Dies scheint zuerst zu funktionieren, könnte aber verwirrend sein, wenn Sie Eigenschaften wie apply oder call verwenden, obj1.functions.alsoDoSomething.call(obj2) funktioniert nicht, da obj2 nicht korrekt ist (Benutzer sollte das tun obj2.functions statt dessen, was verwirrend sein kann).

Die wirkliche Lösung ist: nicht . JavaScript ist nicht für einen solchen Missbrauch gedacht. Alle Objektmethoden sollten direkt im Objektprototyp sein. Wenn Sie ein Objekt darin haben, sind alle Methoden davon keine Methoden Ihres Objekts.

    
xfix 20.10.2012, 11:42
quelle
2

Als Ergänzung zur Antwort von GlitchMr erkläre ich, warum jeder Ihrer Versuche gescheitert ist.

  1. Das Objekt functions wird für den Prototyp deklariert, daher wird @errors nach myClass.errors kompiliert. Das Objekt errors wird jedoch als Instanzelement und nicht als Prototypelement deklariert.
  2. Sie definieren functions mit der Funktionsschreibweise von CoffeeScript, wenn es ein Objekt sein soll. Die Fehlermeldung ist ein CoffeeScript-Compilerfehler; nach der Korrektur dieses Syntaxfehlers funktioniert es wie es sollte!
  3. Sie stellen dieses Beispiel vor, warum es nicht funktioniert, also werde ich es Ihnen nicht zweimal sagen!

Hier ist ein Beispiel für die korrekte Verwendung des dicken Pfeils für diesen Umstand.

%Vor%

Hoffentlich hat das dazu beigetragen, die Fehler zu entmystifizieren und die Kraft von CoffeeScript's fettem Pfeil zu zeigen!

    
user1080806 22.10.2012 21:05
quelle

Tags und Links