2011-07-11 34 views
2

內參照前面定義的屬性當使用對象構造器,屬性可以被直接分配給之前定義的屬性的值:對象常量

var foo = new (function() { 
    this.bar = 5; 
    this.baz = this.bar; 
})(); 
alert(foo.baz) // 5 

我想指的是先前定義的屬性的對象內LITERAL:

var foo = { 
    bar : 5, 
    baz : bar 
} 
alert (foo.baz) // I want 5, but evaluates to undefined 

我知道我能做到這一點:

var foo = { 
    bar : 5, 
    baz : function() { 
     alert(this.bar); // 5 
    } 

但我想直接將baz賦值給一個值而不是函數。有任何想法嗎?

回答

1

您也可以只建立一個由文字部分:

var foo = {bar:5}; 
foo.baz = foo.bar; 

如果需要,以適應這個表達式內(而不是通過多條語句),你可以嘗試濫用逗號操作符也可以使一個輔助函數:

(警告:未經測試的代碼)

function make_fancy_object(base_object, copies_to_make){ 
    var i, copy_from, copy_to_list; 
    for(copy_from in copies_to_make){ 
     if(copies_to_make.hasOwnProperty(copy_from)){ 
      copy_to_list = copies_to_make[copy_from]; 
      for(var i=0; i<copy_to_list.length; i++){ 
       base_object[copy_to_list[i]] = base_object[copy_from]; 
      } 
      } 
     } 
} 

var foo = make_fancy_object(
    {bar: 5}, 
    {bar: ["baz", "biv"]} 
); 

//foo.baz and foo.biv should be 5 now as well. 
+0

謝謝。我想我會使用更標準的解決方案,但這絕對是有創意的! –

3

不,您將無法在創建對象文字之前使用對象文字的任何屬性。你最接近的選項,可能是使用像這樣一個臨時變量:

var tmp = 5, 
    foo = { 
     bar : tmp, 
     baz : tmp 
    } 

如果您可以自由使用的ECMAScript 5個功能,你可以寫爲baz屬性,而不是返回bar值getter函數:

var yourObject = { 
    bar: 5 
}; 
Object.defineProperty(yourObject, 'baz', { 
    get: function() { return yourObject.bar; } 
});