2

clojure を使用して 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でのこの動作が想定されていることは知っていますが、真のプライベート変数を作成するにはどうすればよいですか?

4

2 に答える 2

3

JavaScriptでのこの動作が想定されていることは知っていますが、真のプライベート変数を作成するにはどうすればよいですか?

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

ES5 でシミングできる ES6 WeakMap を使用して ES6 プライベート名をエミュレートできます。これは高価で醜いエミュレーションであり、コストに見合うものではありません。

于 2012-04-08T22:55:39.093 に答える
0

Object.create で作成された 1 つのオブジェクトだけにプライベート変数を追加する必要がある場合は、次のようにします。

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

必要に応じて、次のように不要なパブリック関数 init_private を回避することもできます。

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

悪い点は、複数の呼び出しでプライベート メンバーを追加できないことです。私の意見では、この方法は非常に直感的です。

このコードは Rhino 1.7 リリース 3 2013 01 27 でテストされました

于 2013-05-05T18:53:58.280 に答える