Javascript 转换为单例
我有下面的配置javascript,在这里我可以硬编码选择器div等,并设置一些属性,以便其他函数可以调用它来提供所需的值。我不想每次调用ex.config=new config()时都创建单独的实例,这不好。所以我以javascript闭包的形式修改了代码,不管创建多少次,它都只有一个实例Javascript 转换为单例,javascript,jquery,Javascript,Jquery,我有下面的配置javascript,在这里我可以硬编码选择器div等,并设置一些属性,以便其他函数可以调用它来提供所需的值。我不想每次调用ex.config=new config()时都创建单独的实例,这不好。所以我以javascript闭包的形式修改了代码,不管创建多少次,它都只有一个实例 Config = function() { /** * Ids to external objects. * @public * @type object *
Config = function() {
/**
* Ids to external objects.
* @public
* @type object
*/
this.ids = {
objec1: "whiteboard",
text1: "dialogInputText",
image1: "dialogInputImage",
icons: "dialogIcons",
size: "dialogResize"
};
/**
* Paper Type
* @public
* @type property
*/
this.types = {
store: "TSC",
document: "Document"
}
}
转换为闭包
我喜欢做这样的事情
function MySingletonClass() {
if ( arguments.callee._singletonInstance )
return arguments.callee._singletonInstance;
arguments.callee._singletonInstance = this;
this.Foo = function() {
// ...
}
}
var a = new MySingletonClass()
var b = MySingletonClass()
Print( a === b ); // prints: true
我认为它应该易于实现和测试
从这里
希望这有帮助 您实际上并没有在那里创建闭包,您只是创建了一个函数并在原地执行它。Config正在存储来自该函数的返回 你要找的是一个更复杂的对象。你可以这样做:
Config = (function() {
var ids = {
objec1: "whiteboard",
text1: "dialogInputText",
image1: "dialogInputImage",
icons: "dialogIcons",
size: "dialogResize"
},
types = {
store: "TSC",
document: "Document"
}
return {
getIDs: function (id) {
return ids[id];
},
getTypes: function (type) {
return types[type];
}
}
}());
在这里,getID和getTypes正在访问无法从外部修改或查看的变量,它们实际上是Config中唯一可用的方法
(function(){}())大致相当于function name(){}name(),尽管语法令人困惑,但实际上您所做的是声明一个匿名(未命名)函数,并在声明后立即执行它(您无法以其他方式执行,因为它没有任何名称)。计算该表达式的结果就是执行该函数的结果。但是请注意,第一个表达式不会在更大的范围内引入任何新变量(这是使用此构造的主要原因),而另一个声明会
好的,所以如果你想存储对象而不是普通数据(字符串或数字),你必须尽可能长的存储这些对象才能被修改。IMHO最直接的方法是存储对象json编码并返回解码后的对象。如果这还不够好,您必须检查关于如何“克隆”javascript对象的其他答案。您可以检查这个问题
因此,通过使用JSON,匿名函数将变成这样
(function () {
var ids = {
object1: '{"whiteboard":"an object\'s property"}',
text1: '["an","array"]'
},
...
return {
getIDs: function (id) {
return JSON.parse(ids[id]);
},
getTypes: function (type) {
return JSON.parse(types[type]);
}
}
}());
我希望这有帮助在您的情况下,您也可以编写
Config={id:{…},type:{…}代码>为什么要使用函数?如上所述,只需定义一个数据结构即可。旁注:单例是有害的。拥有一个全球化的国家会让你的生活变得非常艰难,也会让你感到痛苦。测试依赖于隐藏在某处的全局代码的代码非常困难。相反,将该对象传递给执行引导的函数。(记住,)它仍然会将类的实例化限制为一个对象吗?不会。这会使包含在其中的信息变得可变。您可以从所有js文件的window.Config访问此信息。只需确保在所有依赖它的脚本之前先包含此代码即可。这意味着我不必执行config=new config();至少。只要把这段代码放在javascript的某个地方,之后的所有代码都可以访问它
(function () {
var ids = {
object1: '{"whiteboard":"an object\'s property"}',
text1: '["an","array"]'
},
...
return {
getIDs: function (id) {
return JSON.parse(ids[id]);
},
getTypes: function (type) {
return JSON.parse(types[type]);
}
}
}());