在变量初始化上运行代码

时间:2011-11-26 19:20:28

标签: javascript

我刚学会了这种在javascript中初始化变量的方法:

var MyGlobalVar = {
    Property1 : 1,
    Property2 : "Two"
}

这是非常整洁的,因为很多喜欢一个静态对象。但是有什么方法可以在其中运行初始化代码,有点像静态构造函数吗?

如何使用eval,例如Property1 : eval("[code to run here...]");

我只是不想在对象本身之外(括号外)放置任何初始化或部分对象的定义。

编辑:我的初始化代码实际上会返回一个已填充的数组,因此Property2将成为此数组。但我不想每次都需要重新创建这个数组。

4 个答案:

答案 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

因此链条略短。你不应该根据它作出任何决定。