所以下面將不起作用:的Javascript:訪問自己的對象的變量
var Foo = {
array1 : ['apples', 'oranges', 'grapes'],
arrayLength : array1.length // error
}
有什麼辦法,我可以在對象中訪問Foo.array1
的長度?
所以下面將不起作用:的Javascript:訪問自己的對象的變量
var Foo = {
array1 : ['apples', 'oranges', 'grapes'],
arrayLength : array1.length // error
}
有什麼辦法,我可以在對象中訪問Foo.array1
的長度?
你需要做的是這樣的:
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
屬性`
?或:
var x;
var Foo = {
array1 : x = ['apples', 'oranges', 'grapes'],
arrayLength : x.length
};
alert(Foo.arrayLength);
顯然不是那麼好,雅各布Relkin的解決方案是更好的
如果你打算使用一個變量,或許實際上*將它分配到你定義它的同一行中* –
你不能真正訪問這樣的屬性。
您可以使用功能,如:
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']);
我碰巧已經建議你的第二個例子我的答案。 –
你最後的問題讓我想到爲什麼我仍然需要緩存一個屬性。感謝Jacob! 我需要了解更多關於閉包... – user982078