我刚学会了这种在javascript中初始化变量的方法:
var MyGlobalVar = {
Property1 : 1,
Property2 : "Two"
}
这是非常整洁的,因为很多喜欢一个静态对象。但是有什么方法可以在其中运行初始化代码,有点像静态构造函数吗?
如何使用eval
,例如Property1 : eval("[code to run here...]");
?
我只是不想在对象本身之外(括号外)放置任何初始化或部分对象的定义。
编辑:我的初始化代码实际上会返回一个已填充的数组,因此Property2
将成为此数组。但我不想每次都需要重新创建这个数组。
答案 0 :(得分:4)
如果我理解你想要的东西:
var MyGlobalVar = {
Property1 : 1,
Property2 : (function(){ var arr=["this", "is", "an", "array"];return arr; })()
}
Property2
将是一个数组......之后您可以拥有任何代码,无论您返回什么,都将是它的价值。
编辑:我更改了上面的代码以返回数组。
答案 1 :(得分:2)
您可以运行立即函数,而不是使用eval:
var v = {
prop1: function() {
// whatever
return aResult;
}()
}
或以前定义的功能:
function foo() {
// whatever
return aResult;
}
var v = {
prop1: foo(),
}
如果不是严格需要,最好避免使用eval。
答案 2 :(得分:2)
如果确实想要对象内的所有内容,您可以运行一个也在对象文字中定义的函数,它执行以下操作:
类似的东西:
var data = {
prop: (function() {
// init
return "foo";
})(),
prop2: (function() {
// init
return "bar";
})()
};
答案 3 :(得分:2)
如果你想要一个构造函数,为什么不使用构造函数?
var MyGlobalVar = new function() {
// run whatever code you want in here
// The new object being constructed is referenced via "this"
this.Property1 = 1;
this.Property2 = "Two";
};
此代码使用匿名函数作为构造函数。你可以运行你想要的任何代码。新对象由this
引用,并自动返回,因此MyGlobalVar
将如下所示:
{
Property1: 1,
Property2: "Two"
}
另一种方法,也许比使用匿名构造函数更常见,是使用模块模式。它非常相似,但它不使用函数作为构造函数,通过使用new
调用它,它只返回一个对象文字。
上面的代码将被重写为:
var MyGlobalVar = (function() {
// run whatever code you want in here
// The new object is an object literal that we create and return
var _new_obj = {
Property1: 1,
Property2: "Two"
};
return _new_obj;
})();
就像第一个例子一样,它为您提供了一个封闭的环境,您可以在其中运行创建要由对象引用的值所需的任何代码。
最终结果实际上是相同的。唯一真正的区别是第一个示例中对象的prototype
链如下所示:
_new_obj ---> {} ---> Object.prototype ---> null
而新版本中的原型链看起来像:
_new_obj ---> Object.prototype ---> null
因此链条略短。你不应该根据它作出任何决定。