这就是我做事的方式。您将不得不调整原型创建(我从我的版本中删除了一点)。但这将为您提供我在其他基于类的语言中习惯的默认 getter / setter 行为。定义一个 Getter 而没有 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]