esta es la forma en que hago las cosas. Tendrás que modificar la creación del prototipo (eliminé un poco de mi versión). Pero esto le dará el comportamiento de getter/setter predeterminado al que estoy acostumbrado en otros lenguajes basados en clases. Definir un Getter y no Setter significa que se ignorará la escritura en el elemento ...
Espero que esto ayude.
function Game() {
var that = this;
this._levels = [[1,2,3],[2,3,4],[4,5,6]];
var self = {
levels: [],
get levels() {
return that._levels;
},
setLevels: function(what) {
that._levels = what;
// do stuff here with
// that._levels
}
};
Object.freeze(self.levels);
return self;
}
Esto me da el comportamiento esperado de:
var g = new Game()
g.levels
/// --> [[1,2,3],[2,3,4],[4,5,6]]
g.levels[0]
/// --> [1,2,3]
Retomando el critizism de dmvaldman: La escritura debe ser ahora imposible. Reescribí el código para 1) no usar elementos depracados (__ defineGetter __) y 2) no aceptar escritura (es decir, escritura no controlada) en el elemento de niveles. Un setter de ejemplo está incluido.(He tenido que añadir espaciado a __ defineGetter debido a la reducción del precio)
De dmvaldmans solicitud:
g.levels[0] = [2,3,4];
g.levels;
/// --> [[1,2,3],[2,3,4],[4,5,6]]
//using setter
g.setLevels([g.levels, g.levels, 1,2,3,[9]]);
g.levels;
/// --> [[[1,2,3],[2,3,4],[4,5,6]],[[1,2,3],[2,3,4],[4,5,6]], ....]
//using setLevels
g.setLevels([2,3,4]);
g.levels;
/// --> [2,3,4]
@Spudley Por favor, no perpetúen el mito de que JS no es OO. Definitivamente es así. Afirmar lo contrario revela poca comprensión de OO, JS o ambos. – KaptajnKold