Weiß jemand, wie man private, nicht statische Mitglieder in CoffeeScript erstellt? Derzeit mache ich dies, wobei nur eine öffentliche Variable verwendet wird, die mit einem Unterstrich beginnt, um zu verdeutlichen, dass sie nicht außerhalb der Klasse verwendet werden sollte:
class Thing extends EventEmitter
constructor: (@_name) ->
getName: -> @_name
Wenn Sie die Variable in die Klasse einfügen, wird sie zu einem statischen Element. Wie kann ich sie jedoch nicht statisch machen? Ist es überhaupt möglich, ohne "ausgefallen" zu werden?
name
ist nur innerhalb des Konstruktorverschlusses sichtbar. Schauen Sie sich das Wesentliche an: gist.github.com/803810@getName = -> name
eine mögliche Vererbung dergetName
Funktion zu brechen scheint .getName
ist sie öffentlich undname
nur über die Konstruktorfunktion zugänglich, sodass sie für das Objekt nicht wirklich "privat" ist.Klassen sind nur Funktionen, sodass sie Bereiche erstellen. Alles, was in diesem Bereich definiert ist, ist von außen nicht sichtbar.
coffeescript fasst dies wie folgt zusammen:
quelle
foo.call(this)
damitthis
die Instanz Funktion. Aus diesem Grund wird der Versuch, die klassische Vererbung in JavaScript zu emulieren, haarig.var
Deklarationen, die sie beschatten.Ich möchte etwas noch schickeres zeigen
Jetzt können Sie tun
quelle
Es gibt ein Problem mit Vitalys Antwort: Sie können keine Variablen definieren, die für den Bereich eindeutig sein sollen. Wenn Sie auf diese Weise einen privaten Namen erstellt und diesen dann geändert haben, ändert sich der Namenswert für jede einzelne Instanz der Klasse. Es gibt also einen Weg, wie wir dieses Problem lösen können
Es ist nicht unmöglich, von außen auf das Names-Array zuzugreifen, es sei denn, Sie verwenden
getNames
Testen Sie dies
Kompiliertes Javascript
quelle
Hier ist eine Lösung, die sich auf einige der anderen Antworten hier sowie auf https://stackoverflow.com/a/7579956/1484513 stützt . Es speichert die Variablen der privaten Instanz (nicht statisch) in einem Array der privaten Klasse (statisch) und verwendet eine Objekt-ID, um zu wissen, welches Element dieses Arrays die Daten enthält, die zu jeder Instanz gehören.
quelle
Hier ist der beste Artikel , den ich über Einstellung gefunden
public static members
,private static members
,public and private members
, und einige andere ähnliche Sachen. Es umfasst viele Informationen undjs
vs.coffee
Vergleich. Und aus historischen Gründen ist hier das beste Codebeispiel:quelle
So können Sie private, nicht statische Mitglieder in Coffeescript deklarieren
. Eine vollständige Referenz finden Sie unter https://github.com/vhmh2005/jsClass
quelle
"Klasse" in Kaffeeskripten führt zu einem prototypbasierten Ergebnis. Selbst wenn Sie eine private Variable verwenden, wird diese von Instanzen gemeinsam genutzt. Du kannst das:
.. führt zu
Achten Sie jedoch darauf, die privaten Mitglieder vor die öffentlichen Funktionen zu stellen, da das Kaffeeskript die öffentlichen Funktionen als Objekt zurückgibt. Schauen Sie sich das kompilierte Javascript an:
quelle
Da das Kaffeeskript bis auf JavaScript kompiliert wird, können Sie private Variablen nur über Schließungen haben.
Dies wird über das folgende JavaScript kompiliert:
Dies hat natürlich dieselben Einschränkungen wie alle anderen privaten Variablen, die Sie durch die Verwendung von Closures haben können. Beispielsweise haben neu hinzugefügte Methoden keinen Zugriff darauf, da sie nicht im selben Bereich definiert wurden.
quelle
e = new Animal(5);f = new Animal(1);e.test()
warnt eins, ich will fünf.Mit CoffeeScript-Klassen ist dies nicht einfach, da sie das Javascript-Konstruktormuster zum Erstellen von Klassen verwenden.
Man könnte jedoch so etwas sagen:
Sie verlieren jedoch die Größe von CoffeeScript-Klassen, da Sie nicht von einer Klasse erben können, die auf diese Weise auf andere Weise als durch erneutes Verwenden von extens () erstellt wurde. instanceof funktioniert nicht mehr und auf diese Weise erstellte Objekte verbrauchen etwas mehr Speicher. Außerdem dürfen Sie die neuen und super Schlüsselwörter nicht mehr verwenden.
Der Punkt ist, dass die Abschlüsse jedes Mal erstellt werden müssen, wenn eine Klasse instanziiert wird. Die Elementabschlüsse in reinen CoffeeScript-Klassen werden nur einmal erstellt, dh wenn der Klassenlaufzeittyp "Typ" erstellt wird.
quelle
Wenn Sie nur private Mitglieder von öffentlichen trennen möchten, wickeln Sie sie einfach in $ variable ein
und verwenden
@$.requirements
quelle