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