2016-11-03 3 views
1

В следующем примере я использую шаблон «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);

+0

В случае непонятного вопроса, пожалуйста, добавьте комментарий Я делаю все возможное, чтобы уточнить. Благодарю. – GibboK

+0

Сделать _data неперечислимое свойство частного объекта. В JS нет безопасности, и нет никаких оснований быть ревностными в отношении инкапсуляции. – estus

+0

@estus Как он/она сделает это частным? – Taurus

ответ

3

мне нужно держать переменную _data частных (я использую замыкание). Можно ли переместить функцию toJson за пределами init?

Нет. Частные переменные не могут быть доступны извне.

+0

спасибо за подтверждение моих мыслей :) – GibboK

Смежные вопросы