так я делаю вещи. Вам нужно будет настроить Prototype Creation (я удалил бит из моей версии). Но это даст вам поведение по умолчанию getter/setter, к которому я привык, в других языках на основе классов. Определение Getter и no Setter означает, что запись в элемент будет проигнорирована ...
Надеюсь, это поможет.
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;
}
Это дает мне ожидаемое поведение:
var g = new Game()
g.levels
/// --> [[1,2,3],[2,3,4],[4,5,6]]
g.levels[0]
/// --> [1,2,3]
Подняв critizism из dmvaldman: Теперь написание должно быть невозможно. Я переписал код, чтобы 1) не использовать разрозненные элементы (__ defineGetter __) и 2) не принимать никакую запись (то есть: неконтролируемую запись) в элемент уровней. Включен пример setterter.(Я должен был добавить интервал до __ defineGetter из уценки)
Из запроса dmvaldmans:
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 Пожалуйста, не увековечивайте миф о том, что JS не является OO. Это определенно. Утверждение об обратном обнаруживает плохое понимание OO, JS или обоих. – KaptajnKold