я так делаю. Вам нужно будет настроить создание прототипа (я немного удалил из своей версии). Но это даст вам стандартное поведение 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]
Принятие критики от dmvaldman: Письмо теперь должно быть невозможно.
Я переписал код так: 1) не использовать нецензурные элементы (__ defineGetter __) и 2) не принимать никаких записей (то есть неконтролируемых записей) к элементу уровней. Пример сеттера включен. (Мне пришлось добавить интервал к __ 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]