É correto pensar em uma Expressão de Função Javascript que usa a palavra-chave ‘new’ como ‘static’

Eu só estou tentando entender o Javascript um pouco mais profundo.

Eu criei um gameData ‘class’ que eu só quero um, não preciso de um construtor ou instanciado.

Então eu criei assim …

 var gameData = new function () { //May need this later this.init = function () { }; this.storageAvailable = function () { if (typeof (Storage) !== "undefined") { return true; } else { return false; } }; } 

Percebendo que a palavra-chave ‘new’ não permite que ela seja instanciada e a torna disponível LIKE uma class estática seria em C #.

Estou pensando nisso corretamente? Como estático?

Não, não é estático porque ainda tem uma propriedade de constructor apontando para sua function “anônima”. No seu exemplo, você poderia usar

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

para reinstanciar um segundo object, então a “class” (instância na verdade) não é realmente “estática”. Você está basicamente vazando o construtor e, possivelmente, os dados que estão vinculados a ele. Além disso, um object de protótipo inútil ( gameData.constructor.prototype ) é criado e é inserido na cadeia de protótipos gameData , o que não é o que você deseja.

Em vez disso, você pode usar

  • um único object literal simples (como na resposta de Daff ). Isso significa que você não tem um construtor, nenhuma variável privada com escopo de fechamento (você nunca usou nenhum) e nenhum protótipo (personalizado).
  • o padrão do módulo (revelador) (como na resposta de jAndy ). Lá você teria um IIFE para criar variables ​​com escopo de fechamento e pode retornar qualquer tipo de object.
  • um construtor real (“class”) que pode ser instanciado mais tarde (quando necessário) e produz o mesmo object singleton sempre.

É assim que o padrão singleton seria:

 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 

No entanto, o protótipo é completamente inútil porque você tem apenas uma instância do GameData . Só ficaria interessante com inheritance.

Não há Classe no ECMAscript, há apenas Objeto .

Quando new é usado para invocar uma function, nós a chamamos de function construtora . Esta function, um tanto auto, retorna um novo object quando ele é finalizado. Quaisquer dados que são armazenados dentro desse object usando this (que faz referência a esse object recém-criado) são retornados como propriedade desse object. Além disso, new define uma propriedade chamada constructor para exatamente essa function.

No seu caso, você nem mesmo requer o uso de new , você poderia facilmente rewrite seu código da seguinte maneira:

 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; }()); 

Isso é chamado de padrão de fábrica , padrão singleton , padrão de módulo e pode haver alguns outros nomes.

Eu acho que o que você está procurando é apenas um object JavaScript simples:

 var gameData = { //May need this later init : function () { }, storageAvailable : function () { if (typeof (Storage) !== "undefined") { return true; } else { return false; } } } 

Se você quiser usar variables ​​privadas, crie um wrapper de estilo de padrão de módulo de revelação. Isso é basicamente o que jAndy sugeriu:

 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; } } } })();