2014-02-19 166 views
1

我正在寫javascript對象,並防止對同一對象參考的對象,該對象

例如的別名的重複,這裏重複爲同一值的密鑰內:

var colours = { 
    red: { 
     rgb: "255,0,0", 
     hex: "#FF0000" 
    }, 
    brickred: { 
     rgb: "255,0,0", 
     hex: "#FF0000" 
    } 
}; 

我試圖使同一個對象的引用,而不是爲了避免重複:

var colours = { 
    red: { 
     rgb: "255,0,0", 
     hex: "#FF0000" 
    }, 
    brickred: this.red 
}; 

然而,這一點兒也不工作。我意識到(我認爲)這是因爲它指的是窗口對象而不是顏色。所以然後我嘗試:

var colours = { 
    red: { 
     rgb: "255,0,0", 
     hex: "#FF0000" 
    }, 
    brickred: colours.red 
}; 

但這仍然無法正常工作,我不明白爲什麼。我該如何解決這個問題?

N.B.這個例子不是很好,但基本上我有一個對象字面值,並且希望避免在具有相同值的不同鍵時出現重複。我也想知道爲什麼它不好奇

+0

可能重複[Javascript字面值對象,對自身的引用](http://stackoverflow.com/questions/8347770/javascript-literal-object-reference-to-it-self)。另見http://stackoverflow.com/questions/4616202/self-references-in-object-literal-declarations或http://stackoverflow.com/questions/4858931/reference-variable-in-object-literal或https: //www.google.co.uk/?q=object%20literal%20reference%20self%20javascript – Matt

回答

5

因爲在創建時物體(包括它的red鍵)還不存在。你可以在後面加上它,雖然:

var colours = { 
    red: { 
     rgb: "255,0,0", 
     hex: "#FF0000" 
    } 
}; 

colours.brickred = colours.red; 
+0

有道理並解決問題 - 謝謝! – user2521439

1

我覺得對於你具體的例子可能是簡單的封裝對象在一個單獨的變量,然後將其應用於對象,像這樣:

var _RED = { 
    rgb:"255,0,0", 
    hex:"#ff0000" 
} 

var colours = { 
    red: _RED, 
    brickred: _RED 
} 

而且,不是你想有幾個原因真的是什麼,但你可以改變brickred的功能,那麼你可以在您最初嘗試的方法使用this

var colours = { 
    red: { 
     rgb: "255,0,0", 
     hex: "#FF0000" 
    }, 
    brickred: function() { return this.red; } 

};

在這種情況下,您永遠不能更改brickred的值,它必須被稱爲函數而不是像屬性那樣訪問,即colours.brickred()。它總是會返回任何red設置爲。

+1

應該指出,最後的解決方案會這樣工作:'colours.red'和'colours.brickred()'(注意'()') – h2ooooooo

+0

你是對的@ h2ooooooo。我意識到這一點,但會更新示例更清晰。 –