2016-11-03 14 views
1

次の例では、オブジェクトシリアライゼーションの簡単な例を作成するために、Kyle Simpsonの「OLOO(他のオブジェクトにリンクするオブジェクト)パターン」を使用しています。OLOOプライベート変数へのアクセス方法

変数_dataをプライベート(私はクロージャを使用しています)にして、オブジェクトインスタンスレベルで作成するgetterおよびsetter(init)でプロパティを公開する必要があります。

現在、私はそれが_dataにアクセスすることができますinit内の機能toJsonを定義し、それが動作しますが、私が知っているしたいと思います:(の同じレベルに置き

  • inittoJson機能を移動することが可能である場合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);

+0

質問が不明な場合は、コメントを追加してください。私は明確にするために最善を尽くします。ありがとう。 – GibboK

+0

_dataを列挙できないプライベートオブジェクトプロパティにします。 JSにはセキュリティはなく、カプセル化について熱心になる理由はありません。 – estus

+0

@estusどのように彼/彼女はそれを非公開にするでしょうか? – Taurus

答えて

3

私は(私はクロージャを使用しています)プライベート_data変数維持する必要があります。 toJson機能をinitの外に移動することは可能でしょうか?

いいえ、プライベート変数には外部からアクセスできません。

+0

私の考えを確認していただきありがとうございます:) – GibboK

関連する問題