В следующем примере я использую шаблон «OLOO (Образцы ссылок на другие объекты)» Кайла Симпсона для создания простого примера сериализации объектов.OLOO Как получить доступ к частной переменной
Мне нужно сохранить переменную _data
private (я использую закрытие) и выставлять ее свойства только с помощью геттеров и сеттеров, которые создаются на уровне экземпляра объекта (в init
).
В настоящее время я определил функцию toJson
внутри init
так что он может получить доступ к _data
и он работает, но я хотел бы знать:
- Если бы можно перемещать
toJson
функцию внеinit
(поместите его на том же уровнеfromJson
), поэтому он будет доступен через цепочку protoype, но позволяет получить доступ к переменной_data
(я подозреваю, что это невозможно, потому что_data
находится в закрытии). - В противном случае вы могли бы предложить лучшую альтернативу (даже используя ES6), учитывая, что
_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