Hallo,
Hallo,
am ende liegt Struppi so nahe an einem klassen-emulierenden
ergebnis wie in JavaScript eben moeglich.Findest du? Ich sehe in seinem Code
var MyClass = (function() {
var private;
function Proto(){}
Proto.prototype.func = function() {return private;};
Proto.prototype.tu_was = function(p) {private = p * p;};
return Proto;
})();
>
> nur eine eine Closure-Variable, auf die unnötigerweise vom Prototyp aus zugegriffen wird.
Tja, das mit dem unnötigerweise ist vielleicht garnicht so verkehrt.
Viel einfacher ist bei gleicher Leistung doch das übliche
>
> > ~~~javascript
var MyClass = function() {
> > var private;
> > this.func = function() {return private;};
> > this.tu_was = function(p) {private = p * p;};
> > };
Natürlich kann man auch hier nicht durch nachträgliche Erweiterung (außerhalb des Konstruktors) auf p zugreifen. Beim Erzeugen einer Instanz muss trotzdem immer eine neue Funktion "Proto" angelegt werden.
Du meinst jetzt bei Struppis Beispiel? Du hast doch in deinem garkeine Proto-Funktion.
In der Tat hat man somit eine private Klassenvariable. So notiert man das nunmal in JS. Wie heißt es doch so schön: Wenn etwas aussieht wie eine Ente, schwimmt, quakt und watschelt wie eine Ente, dann *ist* es eine Ente. Also warum von Simulation sprechen?
Oder "Umweg".
Im Sinne von "speaking code" ist das "revealing module pattern" aber vielleicht auch interessant. Irgendwie gefällt es mir momentan am besten:
var myObj = function () {
var _privateVar = "privateVarContent",
_privateFunction = function () {
return "privateFunctionReturn";
},
publicFunction = function () {
return "publicFunctionReturn";
};
return {
getPrivate : function () {
return _privateVar + " " + _privateFunction();
},
publicFunction : publicFunction
}
}();
alert(myObj.getPrivate());
alert(myObj.publicFunction());
Wobei ich hier in der Rückgabe gemixed habe. Eigentlich ist es so wohl noch übersichtlichter/richtiger:
var myObj = function () {
var _privateVar = "privateVarContent",
_privateFunction = function () {
return "privateFunctionReturn";
},
publicFunction = function () {
return "publicFunctionReturn";
},
getPrivate = function () {
return _privateVar + " " + _privateFunction();
};
return {
getPrivate : getPrivate,
publicFunction : publicFunction
}
}();
alert(myObj.getPrivate());
alert(myObj.publicFunction());
Gruß
jobo