Die Kapselung erfolgt nicht so, dass sie für einen OO Ansatz wirklich verwendbar ist.
Die Fähigkeiten von JavaScript sind in dem Punkt nicht miteinander verknüpft.
Konstruktoren und deren prototype-Eigenschaften sind ein gesondertes Ding, das sich nicht in die Sprache einfügt. Dass sie keine Private Members einführen, halte ich eigentlich noch für stimmig. Das wäre ja plötzlich »Magie«, während alles andere sich mit der Property Lookups, Prototype Chain, der Scope Chain usw. erklären lässt.
Funktionen hängen ja nur lose an Objekten und sie nicht an sie gebunden. Daher wäre es erst einmal unlogisch, ihnen besondere Rechte beim Zugriff auf andere Objektmember zu geben. Ihre Beziehung zum Objekt ist keine besondere, höchstens in dem Sinne, dass ihr die Hat-Beziehung durch »this« mitgeteilt wird, wenn sie über diesen Pfad aufgerufen wird.
Dass JavaScript hier Features hat, die nicht widerspruchslos miteinander kombinierbar sind, ist bekannt. Es kommt nicht von ungefähr, dass Crockford das Konstruktor-Prototyp-Pattern als irreführend verurteilt. Das ist es tatsächlich. Es referiert auf klassenbasierte OOP, löst diese aber nicht ein, weil JS nur einfache Objekte und First-Class-Funktionen kennt. Es ist weder wirklich funktional (was Kapselung durch Funktionsscops und Closures erlauben würde) noch wirklich prototypisch (was einfache Delegation erlauben würde).
Darum ging es in der vorgestellten Bibliothek von Florian und darum ging es mir in der Diskussion.
Die Idee, beides zusammenzubringen, halte ich ja nicht für falsch. Wie gesagt, das ist absolut nichts neues. Die einen gehen den Weg, dass sie Konstruktoren/prototype-Eigenschaften gar nicht mehr verwenden und direkt auf funktionale/prototypische OOP setzen. Mootools geht den Weg, dass sich Methoden mit dem $protected-Flag versehen lassen (function () {}.protect()). Da Mootools wie gesagt sowieso jeden Methodenaufruf kapselt, prüfen sie bei der Gelegenheit einfach auch den $protected-Flag (siehe Mootools' Class.js). Wenn ich das richtig sehe, müsste es genauso möglich sein, sämtliche Methoden mit _-Präfix automatisch protected zu machen.
Das sind alles »behutsamere« Methoden, wo ich mich frage, ob das nicht schon völlig ausreicht. Mootools Implementierung ist unter dem Strich sehr kompakt und einfach.
Ich kritisiere das Konzept gar nicht, ich bin es nicht anders gewohnt.
Es ist aber kritikwürdig und selbst die Gurus verteufeln es. ;)
Mathias