2011-01-26 48 views
1

我正在研究一個jQuery插件,並且對於我正在使用的一些對象有幾個問題。我保證我花了大約一個小時搜索谷歌,但顯然我的搜索條件不夠具體。這裏有一個例子:JavaScript對象,兩個問題

var rgba = { 
    red = { 
     startHex : 'FF', 
     startDec : parseInt(startHex,16), 
     endHex  : '00', 
     endDec  : parseInt(endHex,16), 
     diffDec  : endDec - startDec 
    }, 

    green = { 
     startHex : 'FF', 
     startDec : parseInt(startHex,16), 
     endHex  : '00', 
     endDec  : parseInt(endHex,16), 
     diffDec  : endDec - startDec 
    }, 

    blue = { 
     startHex : 'FF', 
     startDec : parseInt(startHex,16), 
     endHex  : '00', 
     endDec  : parseInt(endHex,16), 
     diffDec  : endDec - startDec 
    }, 
} 

現在,它會告訴我, 'startHex' 在 'parseInt函數(startHex,16)' 是不確定的。是否有可能從一個兄弟屬性中引用一個對象中的另一個屬性,如果是的話,你是如何做到的?

我的另一個問題是,因爲'rgba'的屬性本身都具有相同的屬性,我如何使用帶有for循環的數組來引用每個屬性?例如,這是不行的:

var colors = ['red','green','blue']; 
for(i in colors) { 
    alert(rgba.colors[i].diffDec); 
} 

出於顯而易見的原因,因爲此代碼應該有所謂的「顏色」爲「RGBA」對象的屬性。我想過使用eval():

var colors = ['red','green','blue']; 
for(i in colors) { 
    alert(rgba.eval(colors[i]).diffDec); 
} 

但它告訴我,的eval()不是 'RGBA' 的屬性。關於我如何做到這一點的任何建議(除了在'rgba'下實際創建屬性'顏色')?

謝謝!

+1

請將此分成兩個單獨的問題。 – zzzzBov 2011-01-26 19:49:37

回答

1

第一點要明白的是,範圍在JavaScript比不同在其他一些面向對象的語言中。 JS中的範圍不是基於對象,而是基於函數。所以,可能是最好的辦法是創建一個用於創建一個顏色的功能,如:

var makeColor = function(startHexValue, endHexValue) { 
    var start = parseInt(startHexValue, 16); 
    var end = parseInt(endHexValue, 16); 
    return { 
    startHex: startHexValue, 
    startDec: start, 
    endHex: endHexValue, 
    endDec: end, 
    diffDec: start - end 
    }; 
}; 

(當然,你可以很容易地改變成,如果你真的想要一個構造函數)。然後你的RGBA對象變爲:

var rgba = { 
    red : makeColor("FF", "0"), 
    green : makeColor("FF", "0"), 
    blue : makeColor("FF", "0") 
}; 

然後你的最後一部分應該是:

var colors = ['red','green','blue']; 
for(name in colors) { 
    alert(rgba[name].diffDec); 
} 

的字符串是屬性的名稱,而不是屬性本身。

0

你問這裏的兩個問題:

  1. 回答第一個問題—的一個有關對象不變語法—是,你不能指從初始化代碼的對象的其他元素。換句話說,該對象並不存在。你可以用一個表達式初始化它,然後運行一個函數來填充你需要的附加屬性。

  2. 有關「eval()」不是「rgba」屬性的錯誤,它不是「rgba」的屬性。代碼中的任何地方都沒有稱爲「eval」的功能。全球「eval」功能就是這樣:全球。

最後,你說的那個循環不起作用,好吧,我敢打賭它確實如此。對我來說似乎沒有任何問題,除了這是一個「for ... in」循環。那些真的不應該用來遍歷數組,除非你知道你爲什麼想要這樣做,真的

3

您不能以這種方式訪問​​其他屬性。但你可以做什麼,是:

function Color(startHex, endHex) { 
    this.startHex = startHex; 
    this.endHex = endHex; 
    this.startDec = parseInt(startHex,16); 
    this.endDec = parseInt(endHex,16); 
    this.diffDec = this.endDec - this.startDec; 
} 


var rgba = { 
    red : new Color('FF','00'), 
    green : new Color('FF','00'), 
    blue : new Color('FF','00') 
} 

至於你的第二部分,你添加一個不必要的步驟。只需使用:

for(prop in rgba) { 
    alert(rgba[prop].diffDec); 
} 

記住,使用JavaScript,這兩者是等價的:

myobject.myproperty 

myobject["myproperty"] 
+1

構造函數不完全正確,因爲你缺少一些`this`關鍵字。特別是`this.endDec - this.startDec;`:o) – user113716 2011-01-26 19:55:04

+1

@patrick dw。完全正確。謝謝。固定的 – 2011-01-26 20:02:10