5

私は現在、JavaScript でクラスを構築するためのさまざまなパターンを検討しています。しかし、どんなパターンを見ても、まだよくわからないことがいくつかあります。

var ItemManager = (function()
{
    var p = function()
    {
        this.items= [];
    };

    p.prototype.addItem = function(item)
    {
        var self = this;    
        self.items.push(item);
    };

    return p;
}());

シンプルなクラスItemManagerを作成します。このクラスは、任意の項目をコレクションに追加する関数addItemを取得します。ここで、コレクションを表す変数 items をパブリックにしたくありません。この変数はプライベートにする必要がありますが、プロトタイプ化されたメソッドを使用してプライベート変数にアクセスする方法はありません。

では、この場合のベストプラクティスは何ですか? プライベート変数を使用しないでください。

4

3 に答える 3

6
var ItemManager = function() {
    var items = [];

    return {
           addItem : function(item) {   
               items.push(item);
           },
           removeItem : function() {
                return items.pop();
           }
     }
};

var myItemManager = new ItemManager();

items変数はItemManager関数の実行後に非表示になりますがaddItemremoveItemへのアクセスは引き続き共有されitemsます。詳細な調査については、JavaScript のプライベート変数に関する Douglas Crockford の記事を参照してください。

于 2013-11-01T11:19:16.127 に答える
1

プライベート変数を持つ方法はいくつかあります。

シンボルはリフレクションを使用して見つけることができますが (つまり、完全に非公開ではありません)、私はシンボルを好みます。例:

var Person = (function() {
    var nameSymbol = Symbol('name');
​
    function Person(name) {
        this[nameSymbol] = name;
    }
​
    Person.prototype.getName = function() {
        return this[nameSymbol];
    };
​
    return Person;
}());

したがって、(合理的に)プライベート変数を持つことは可能ですが、残念ながら、希望するほどエレガントなソリューションはありません。

于 2016-07-19T03:28:16.613 に答える