我有以下配置 JavaScript,我可以在其中对选择器 div 等进行硬编码并设置一些属性,以便其他函数可以调用它来提供所需的值。我不想每次调用 ex 时都创建单独的实例。 config = new Config() 这不好。所以我以javascript闭包的形式更改了代码,是不是无论创建多少次都只有一个实例?
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"
}
}
转换为闭包
Config = (function(){
result = { /**
* Ids to external objects.
* @public
* @type object
*/
ids: {
objec1: "whiteboard",
text1: "dialogInputText",
image1: "dialogInputImage",
icons: "dialogIcons",
size: "dialogResize"
},
/**
* Paper Type
* @public
* @type property
*/
types: {
store: "TSC",
document: "Document"
}
})()
最佳答案
你实际上并没有在那里创建一个闭包,你只是创建一个函数并就地执行它。配置正在存储该函数的返回结果。
您正在寻找的是一个更复杂的对象。你可以这样做:
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];
}
}
}());
这里,getIDs 和 getTypes 正在访问无法修改或从外部查看的变量,实际上是 Config 中唯一可用的方法。
(function(){}()) 大致相当于 function name(){} name(),虽然语法很困惑,但你所做的实际上是声明一个匿名(未命名)函数并尽快执行它正如它所声明的那样(您无法以其他方式执行此操作,因为它没有任何名称)。计算该表达式的结果是执行该函数的结果。但请注意,第一个表达式不会在更大的范围内引入任何新变量(这是使用此构造的主要原因),而另一个声明则会引入任何新变量。
好吧,如果您想存储对象而不是普通数据(字符串或数字),则必须花费大量精力才能使这些对象不可修改。恕我直言,最直接的方法是存储编码的对象 json 并返回解码后的对象。如果这还不够好,您将不得不检查有关如何“克隆” javascript 对象的其他答案,您可以检查此问题 What is the most efficient way to deep clone an object in 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]);
}
}
}());
希望这有帮助
关于javascript - 转换为单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17328499/