Aber das Problem ist, du kannst mit JS nicht wirklich OO programmieren.
Naja, ob Soshnikov das auch so sieht. Was soll denn "wirklich OO" sein. Javascript is about Objects. Functions are first class Objects. Das ist dann sprachlich schon verwirrend, wenn ich hier nicht von Objektorientiert sprechen möchte. Objektorientiert heißt meines Verständnisses auch, Objekte abzubilden, also Sinnzusammenhänge zu kapseln. Es heißt auch, dass vererbt werden kann. Ob ich nun "extend" schreibe oder "prototyp" ist doch egal.
Objekte ist im Prinzip erstmal nichts weiter, als eine Struktur. Das gibt es auch in C. Nur das vorhanden sein eines Objektes macht noch keine OO Sprache. Aber du hast insoweit recht, dass JS einige rudimentäre Mechanismen der OOP mitbringt. Aber sonst nchts.
Aber es fehlen die grundlegendsten Dinge, echte private Member,
Äh, die sind doch im Funktionsscope geclosed und für innere Funktionen aber weiter verfügbar. Was anderes als das ist das Prinzip von "private"?
Ein private Member ist Klassenweit sichtbar, nicht nur im Konstruktor, dass ist genau das, was Florian mit seinem Code erreichen will.
auf die du z.b. auch in den prototype Funktionen zugreifen kannst
In PHP ist es doch so, dass private variablen nicht mit vererbt werden.
Nicht vererbt, ich rede vom prototype der gleichen "Klasse".
protected geht gar nicht mehr.
... stattdessen aber protected. Ich kann keine privaten Variablen in Unterfunktionen nutzen so dass sie dann auch vererbbar sind? Das was Crockford priveligierte Funktionen nennt?
Nein. privilegierte Funktionen dürfen auf private Member zugreifen. Normalerweise heißt aber privilegiert, dass du einer anderen Klasse erlaubst auf die privaten member zu zugreifen.
protected heißt dass du private Elemente vererben kannst. Das geht mit JS Bordmitteln gar nicht.
Letztlich bleibt der einzige sinnvolle Weg, so wie es Mathias auch auf seinem Blog beschrieben hat. Private Eigenschaften kennzeichnen, dass sie privat sein sollen und eine einfache Vererbung über die prototype Eigenschaft und den Aufruf der superfunktione über call bzw. apply delegieren.
Naja, das ist ein Weg, um beim programmieren nicht selber durcheinander zu kommen, macht man in Linux ja auch, indem man ein "." voranstellt. "Vorsicht, nicht anpacken". Aber nach außen hin gibt es die Privatheit ja doch, würde ich nach wie vor meinen. Ich sehe diese Konvention mit dem "_" bei YUI aber auch.
Eben weil es eben in JS nicht anders geht. Es ist aber nur eine Krücke und letztlich, wie gesagt, die einzige sinnvolle. In Sprachen die OO Regeln umsetzen, brauchst du diese nicht.
Struppi.