これが私のやり方です。プロトタイプの作成を微調整する必要があります(バージョンから少し削除しました)。しかし、これにより、他のクラスベース言語で慣れているデフォルトのゲッター/セッターの動作が得られます。ゲッターを定義し、セッターを定義しないということは、要素への書き込みが無視されることを意味します...
お役に立てれば。
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]