将“new”关键字用作“static”的Javascript函数expression式是否正确?

我只是想更深入地理解Javascript。

我创build了一个' gameData ,我只想要其中的一个,不需要构造函数或实例化。

所以我创造了这样的…

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

意识到“新”关键字不允许它被实例化并使其可用像静态类将在C#中。

我是否正确地思考这个问题? 作为静态?

不,它不是静态的,因为它仍然有一个指向你的“匿名”函数的constructor属性。 在你的例子中,你可以使用

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

重新实例化第二个对象,所以“类”(实际的实例)并不是真正的“静态”。 您基本上正在泄漏构造函数,并可能绑定到它的数据。 此外,一个无用的原型对象( gameData.constructor.prototype )确实被创build并被插入到gameData的原型链中,这不是你想要的。

相反,你可以使用

  • 一个简单的对象字面量(如Daff的答案 )。 这意味着你没有构造函数,没有封闭范围的私有variables(你还没有使用过),没有(自定义的)原型。
  • (揭示)模块模式(如jAndy的答案 )。 在那里你将有一个IIFE来创build闭包variables,并且可以返回任何types的对象。
  • 一个实际的构造函数(“类”),可以稍后(需要时)实例化,并始终产生相同的单例对象。

这是单身模式的样子:

 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 

然而,原型是无用的,因为你只有一个GameData实例。 它只会inheritance有趣。

ECMAscript中没有Class ,只有Object

当使用new来调用函数时,我们称之为构造函数 。 这个函数完成后会自动返回一个新的对象。 使用this对象(引用新创build的对象)存储在该对象内的任何数据作为该对象的属性返回。 除此之外, 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; }()); 

这被称为工厂模式单例模式模块模式 ,并且可能有其他一些名称。

我认为你正在寻找的只是一个简单的JavaScript对象:

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

如果你想使用私有variables创build一个揭示模块模式样式包装。 这基本上是jAndy所build议的:

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