我有以下配置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"
}
})()
答案 0 :(得分:1)
我喜欢这样做......
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
我认为应该很容易实现和测试。
从这里...... https://code.google.com/p/jslibs/wiki/JavascriptTips#Singleton_pattern
希望这会有所帮助。
答案 1 :(得分:1)
你还没有在那里创建一个闭包,你只是创建一个函数并在原地执行它。 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];
}
}
}());
这里,getIDs和getTypes正在访问无法修改或从外部看到的变量,实际上是Config中唯一可用的方法。
(function(){}())大致等同于函数名(){} name(),虽然语法令人困惑,但你所做的实际上是声明一个匿名(未命名)函数并尽快执行它因为它被声明(你不能以另一种方式做,因为它没有任何名字)。评估该表达式的结果是执行该函数的结果。但是请注意,第一个表达式不会在较大的范围内引入任何新变量(这是使用此结构的主要原因),而另一个声明将使用。
好的,所以如果你想存储对象而不是普通数据(字符串或数字),你必须付出很大的代价才能使这些对象不可修改。 IMHO最直接的方式是存储对象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]);
}
}
}());
我希望这会有所帮助