我只是想更深入地理解Javascript。
我创建了一个"类"gameData
,我只需要其中一个,不需要构造函数或实例化。
所以我像这样创建了它...
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# 中的静态类一样。
我的想法正确吗? 作为静态的?
不,它不是静态的,因为它仍然有一个指向你的"匿名"函数的constructor
属性。在您的示例中,您可以使用
var gameData2 = new (gameData.constructor)();
重新实例化第二个对象,因此"类"(实际上是实例(并不是真正的"静态"。您基本上泄漏了构造函数,并可能泄漏了绑定到它的数据。此外,一个无用的原型对象(gameData.constructor.prototype
(确实被创建并插入到gameData
的原型链中,这不是你想要的。
相反,您可以使用
- 一个单一的、简单的对象文字(如达夫的答案(。这意味着你没有构造函数,没有闭包范围的私有变量(无论如何你都没有使用(和(自定义(原型。 (
- 揭示(模块模式(如 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
然而,原型是毫无用处的,因为你只有一个实例 GameData
.只有继承才会变得有趣。
ECMAscript 中没有 Class,只有 Object。
当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;
}());
这称为工厂模式、单例模式、模块模式,可能还有其他一些名称。
我认为您正在寻找的只是一个简单的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;
}
}
}
})();