Noch ein anderes Beispiel in ES5:
function makeO () {
var o = {};
Object.defineProperties(o, {
öffentlicheMethode : {
value : function () { this._privateMethode(); },
enumerable : true, writable : false, configurable : false
},
_privateMethode : {
value : function () { alert('Hallo Welt'); },
enumerable : false, writable : false, configurable : false
},
öffentlicheEigenschaft : {
get : function () { return this._privateEigenschaft * 5; },
set : function (v) { this._privateEigenschaft = v / 5; },
enumerable : true, configurable : false
},
_privateEigenschaft : {
value : 1,
enumerable : false, writable : true, configurable : false
}
});
Object.preventExtensions(o);
return o;
}
var o1 = makeO();
o1.öffentlicheMethode();
alert(o1.öffentlicheEigenschaft);
o1.öffentlicheEigenschaft = 100;
alert(o1.öffentlicheEigenschaft);
Das ist jetzt natürlich eine sehr verquaste Schreibweise. Den ganzen Kladderadatsch könnte man aber wunderbar wegabstrahieren.
Natürlich habe ich hier keine effektive Kapselung. _privateEigenschaft ist immer noch ein normaler Member, den ich von außen lesen und schreiben kann. Aber wieso brauche ich noch mehr? Wobei hilft mir das? Bei YUI gibt es tausende pseudo-protected Methoden. Wem schadet das? Ist das für Modulautoren unklar? Es ist doch recht simpel. Protected Methoden werden mit _-Präfix versehen und mit JSDOC als protected gekennzeichnet. That's it.
Mathias