2011-10-06 48 views

回答

2

你需要做的是這樣的:

var Foo = {}; 
Foo['array1'] = ['apples', 'oranges', 'grapes']; 
Foo['arrayLength'] = Foo['array1'].length; 

或像這樣(更清潔恕我直言):

var Foo = function() { 
    var a = ['apples', 'oranges', 'grapes']; 
    return {'array1': a, 'arrayLength':a.length}; 
}(); 

另一種選擇:

function Foo(array) { 
    this.array1 = array; 
    this.arrayLength = array.length; 
    //other stuff... 
} 

var f = new Foo(['apples', 'oranges', 'grapes']); 

不過說真的,這對我來說沒有多大意義你已經存儲陣列,你爲什麼需要緩存的length屬性`

+0

你最後的問題讓我想到爲什麼我仍然需要緩存一個屬性。感謝Jacob! 我需要了解更多關於閉包... – user982078

0

?或:

var x; 
var Foo = { 
    array1 : x = ['apples', 'oranges', 'grapes'], 
    arrayLength : x.length 
}; 
alert(Foo.arrayLength); 

顯然不是那麼好,雅各布Relkin的解決方案是更好的

+0

如果你打算使用一個變量,或許實際上*將它分配到你定義它的同一行中* –

0

你不能真正訪問這樣的屬性。
您可以使用功能,如:

var Foo = { 
    array1 : ['apples', 'oranges', 'grapes'], 
    arrayLength : function(){ return this.array1.length;} 
} 

這其實是一件好事,我建議使用此,因爲Foo.array1陣列可以及時更換,你可能希望arrayLength場進行更新。

另一種選擇是使用閉包返回的對象常量:如果你真的想進入面向對象的東西

var Foo = (function(){ 
    var array1 = ['apples', 'oranges', 'grapes']; 
    return { 
     array1 : array1, 
     arrayLength : array1.length 
    }; 
})(); 

,您可以使用「構造」和prototypes此:

var FooClass = function(array){this.init(array);} 
FooClass.prototype = new function(){ 
    this.init = function(array){ 
     this.array1 = array; 
     this.updateArrayLength(); 
    }; 
    this.updateArrayLength = function(){ 
     this.arrayLength = this.array1.length; 
    }; 
    this.array1 = []; 
    this.arrayLength = 0;   
}; 

var Foo = new FooClass(['apples', 'oranges', 'grapes']), 
    Foo2 = new FooClass(['bananas', 'limes', 'grapefruits']); 
+0

我碰巧已經建議你的第二個例子我的答案。 –