次の例では、オブジェクトシリアライゼーションの簡単な例を作成するために、Kyle Simpsonの「OLOO(他のオブジェクトにリンクするオブジェクト)パターン」を使用しています。OLOOプライベート変数へのアクセス方法
変数_data
をプライベート(私はクロージャを使用しています)にして、オブジェクトインスタンスレベルで作成するgetterおよびsetter(init
)でプロパティを公開する必要があります。
現在、私はそれが_data
にアクセスすることができますinit
内の機能toJson
を定義し、それが動作しますが、私が知っているしたいと思います:(の同じレベルに置き
init
外toJson
機能を移動することが可能である場合fromJson
)プロトタイプのチェーンを介してアクセスできますが、_data
変数にアクセスすることができます(_data
がクロージャーになっているため可能ではないと思われます)。- そうでなければ、
_data
はゲッターとセッターを使用して列挙できず、変更できないようにしておくことをお勧めしますか?
// example of serialization and deserialization of an object
(function (window) {
var dataApi = '{"id":0,"top":10,"left":20,"width":100,"height":150}';
var state = JSON.parse(dataApi);
var base = {
init: function (data) {
var _data = data; // private
// defined on object itself not on its protoype
Object.defineProperty(this, 'id', {
get: function() {
return _data.id;
},
set: function (value) {
_data.id = value;
}
});
Object.defineProperty(this, 'top', {
get: function() {
return _data.top;
},
set: function (value) {
_data.top = value;
}
});
Object.defineProperty(this, 'left', {
get: function() {
return _data.left;
},
set: function (value) {
_data.left = value;
}
});
Object.defineProperty(this, 'width', {
get: function() {
return _data.width;
},
set: function (value) {
_data.width = value;
}
});
Object.defineProperty(this, 'height', {
get: function() {
return _data.height;
},
set: function (value) {
_data.height = value;
}
});
this.toJson = function() {
// move this function to prototype
return JSON.stringify(_data);
}
},
// defined on protoype
fromJson: function (json) {
var data = JSON.parse(json),
obj = Object.create(this);
obj.init(data);
return obj;
}
};
// create object with linked prototype using deserialization
var wdgA = base.fromJson(dataApi);
// serialize object
var str = wdgA.toJson();
console.log(str);
// create object with data injection
var wdgB = Object.create(base);
wdgB.init(state);
var id = wdgB.id;
console.log(id);
})(window);
質問が不明な場合は、コメントを追加してください。私は明確にするために最善を尽くします。ありがとう。 – GibboK
_dataを列挙できないプライベートオブジェクトプロパティにします。 JSにはセキュリティはなく、カプセル化について熱心になる理由はありません。 – estus
@estusどのように彼/彼女はそれを非公開にするでしょうか? – Taurus