wie kann ich denn private Daten, die im Konstruktor gesetzt wurden den Methoden im Prototype-Objekt bekannt machen.
JavaScript hat nicht die OOP-Fähigkeiten anderer bekannter Sprachen und es ist problematisch, das Konzept der Kapselung auf JavaScript zu übertragen. Privatheit gibt es in JavaScript nur durch Closures. Das ist erstmal was ganz anderes, ein funktionales statt ein objektorientiertes Feature, und ist auch nicht an die Verwendung im Zusammenhang mit Konstruktoren und Instanzen gebunden.
Aus funktionaler Sicht ist dein Ausgangsbeispiel mit K.prototype = new function () {} eigentlich sehr passend und es wäre auch sinnig, wenn du die durch Closure verfügbaren Methoden mit call bzw. apply im Kontext der Instanz ausführst. Das wäre m.M.n. JavaScript-typisch, alles andere wären Versuche, gänzlich anders organisiertes OOP aus anderen Sprachen in JavaScript umzusetzen. Das geht nicht, das ist auch nicht unbedingt sinnvoll und wird den Features von JavaScript nicht gerecht.
Wie gesagt könnte man Privatheit simulieren, indem man die Methoden über eine Funktion hinzufügt, die sie alle kapselt:
var K = Class.create({
private : {
pr : function () {}
},
public : {
pu : function () {
this.private.pr();
}
}
});
var i = new K;
i.pu();
Class.extend(K, {
private : {
pr2 : function () {}
},
public : {
pu2 : function () {
this.private.pr();
this.private.pr2();
}
}
});
i = new K;
i.pu();
i.pu2();
Class.create und extend müssten natürlich geschrieben werden. Die öffentlichen Methoden würden so gekapselt, dass in ihnen this.private verfügbar ist, aber die Instanz hätte diesen Member nur kurzzeitig.
Ist zwar auch nicht schön, dieses ständige Anlegen und Löschen von Referenzen, aber die Aufgabenstellung verhindert wie gesagt JavaScript-typische Lösungen. Ich würde das nicht so umsetzen, sondern die funktionalen Fähigkeiten von JavaScript ernst nehmen.
Mathias