27

私はJavascriptをもう少し深く理解しようとしています。

gameDataそのうちの1つだけが必要な、コンストラクターを必要としない、またはインスタンス化された「クラス」を作成しました。

だから私はそれをそのように作成しました...

var gameData = new function () {

    //May need this later 
    this.init = function () { 
    };

    this.storageAvailable = function () {
        if (typeof (Storage) !== "undefined") {
            return true;
        }
        else {
            return false;
        }
    };
}

'new'キーワードを使用すると、インスタンス化できず、静的クラスがC#の場合と同じように使用できるようになります。

私はこれを正しく考えていますか?静的ですか?

4

3 に答える 3

28

constructorいいえ、 「匿名」関数を指すプロパティがまだあるため、静的ではありません。あなたの例では、

var gameData2 = new (gameData.constructor)();

2番目のオブジェクトを再インスタンス化するため、「クラス」(実際にはインスタンス)は実際には「静的」ではありません。基本的に、コンストラクターと、それにバインドされているデータをリークしています。また、役に立たないプロトタイプオブジェクト(gameData.constructor.prototype)が作成され、のプロトタイプチェーンに挿入されますがgameData、これは必要なものではありません。

代わりに、

  • 単一の単純なオブジェクトリテラル(Daffの回答のように)。つまり、コンストラクター、クロージャースコープのプライベート変数(とにかく何も使用していない)、および(カスタム)プロトタイプがありません。
  • (明らかにする)モジュールパターン(jAndyの回答のように)。そこで、クロージャスコープの変数を作成するためのIIFEがあり、あらゆる種類のオブジェクトを返すことができます。
  • 後で(必要に応じて)インスタンス化できる実際のコンストラクター(「クラス」)であり、常に同じシングルトンオブジェクトを生成します。

シングルトンパターンは次のようになります。

function GameData() {
    if (this.constructor.singleton)
        return this.constructor.singleton;
    else
        this.constructor.singleton = this;

    // init:
    // * private vars
    // * public properties
    // ...
}
GameData.prototype.storageAvailable = function () {
    if (typeof (Storage) !== "undefined") {
        return true;
    }
    else {
        return false;
    }
};

var gameData = new GameData();
var gameData2 = new GameData();
gameData === gameData2 === GameData.singleton; // true

ただし、のインスタンスが1つしかないため、プロトタイプはまったく役に立ちませんGameData。それは継承によってのみ面白くなるでしょう。

于 2012-05-02T01:31:47.070 に答える
15

ECMAscriptにはクラスはなく、オブジェクトのみがあります。

newが関数を呼び出すために使用される場合、それをコンストラクター関数と呼びます。この関数は、終了すると新しいオブジェクトをいくらか自動的に返します。this(新しく作成されたオブジェクトを参照する)を使用してそのオブジェクト内に格納されたデータはすべて、そのオブジェクトのプロパティとして返されます。そのほかに、コンストラクターnewと呼ばれるプロパティを正確にこの関数に設定します。

あなたの場合、あなたは本当にの使用を必要とさえしません、あなたはnew次のようにあなたのコードを簡単に書き直すことができます:

var gameData = (function () {
    var public = { },
        private = { }; // any private data can get stored here

    //May need this later 
    public.init = function () { 
    };

    public.storageAvailable = function () {
        if (typeof (Storage) !== "undefined") {
            return true;
        }
        else {
            return false;
        }
    };

    return public;
}());

これはファクトリパターンシングルトンパターンモジュールパターンと呼ばれ、他の名前もあるかもしれません。

于 2012-05-02T01:28:05.793 に答える
5

あなたが探しているのは単純なJavaScriptオブジェクトだと思います。

var gameData = {
    //May need this later 
    init : function () { 
    },

    storageAvailable : function () {
        if (typeof (Storage) !== "undefined") {
            return true;
        }
        else {
            return false;
        }
    }
}

プライベート変数を使用する場合は、公開モジュールパターンスタイルラッパーを作成します。これは基本的にjAndyが提案したものです:

var gameData = (function() {
    var private = 'private variable';

    return {
        //May need this later 
        init : function () { 
        },

        storageAvailable : function () {
            if (typeof (Storage) !== "undefined") {
                return true;
            } else {
                return false;
            }
        }
    }
})();
于 2012-05-02T01:28:09.367 に答える