2012-04-08 10 views
2

私はclojureを使ってjavascriptでプライベート変数を作る方法を知りました。しかし、Object.createを使用した場合でもクローンを作成してください。Javascriptのプライベート変数+ Object.create(クロージャ変数への参照)

var point = {}; 
(function(){ 
    var x, y; 
    x = 0; 
    y = 0; 
Object.defineProperties(point, { 
    "x": { 
     set: function (value) { 
     x = value; 
     }, 
     get: function() { 
     return x; 
     } 
    }, 
    "y": { 
     set: function (value) { 
     y = value; 
     }, 
     get: function() { 
     return y; 
     } 
    } 
    }); 
}()); 

var p1 = Object.create(point); 
p1.x = 100; 
console.log(p1.x); // = 100 
var p2 = Object.create(point); 
p2.x = 200; 
console.log(p2.x); //= 200 
console.log(p1.x); //= 200 

私はhttp://ejohn.org/blog/ecmascript-5-objects-and-properties/からこの技術を得たが、それはクロージャ変数は、すべてのオブジェクトで同じであることをこの制限を得ました。私はjavascript上でこの動作を知っているが、どのように私は本当のプライベート変数を作成できますか?

+0

このコードでテストされましたが、自動生成されたに見えますか? – Raynos

+0

いいえ、それはなぜそれが自動生成されたように見えると思いませんでしたか? – automaticoo

+0

プライベート変数のない代替手段として、http://jsfiddle.net/heera/G9E9m/ –

答えて

3

私はjavascriptでこの動作を知っていますが、どのように私は本当のプライベート変数を作成できますか?

ES5にプライベートはありません。必要に応じて、ES6のプライベートネームを使用できます。

ES6のプライベートネームは、ES5でシミングできるES6ウィークマップでエミュレートできます。これは高価で醜いエミュレーションですが、それはコストがかかりません。

+0

があります。プライベート変数を使用しない代わりに、http://jsfiddle.net/heera/G9E9m/ –

0

あなたは、このことができますObject.createを使用して作成されたただ一つのオブジェクトにプライベート変数を追加する必要があります。あなたはあなたもこのような不要なパブリック関数init_privateを避けることができますしたい場合は

var parent = { x: 0 } 
var son = Object.create(parent) 
son.init_private = function() 
{ 
    var private = 0; 
    this.print_and_increment_private = function()  
    { 
     print(private++); 
    } 
} 
son.init_private() 
// now we can reach parent.x, son.x, son.print_and_increment_private but not son.private 

(function()                                                  
{                                                    
    var private = 0; 
    this.print_and_increment = function() 
    { 
     print(private++); 
    } 
} 
).call(son) 

悪い事はあなたがは、いくつかの呼び出しでプライベートメンバーを追加することができなかったということです。良いことは、この方法は私の意見では非常に直感的であるということです。それはClojureのコードによって生成された

このコードはRhinoの1.7リリース3 2013 01 27

関連する問題