2013-02-17 295 views
0

我發現沒有辦法做到這一點。不過,謝謝大家! In javascript, can I override the brackets to access characters in a string?更改默認數組類型getter Javascript

我有這樣的事情:

function f() { 
    var list = [{name: 'test'}, {name: 'test2'}]; 
} 

而且我想從該列表是這樣的函數內部獲取屬性,我覺得有一些覆蓋默認的[]的方法,但我真不不知道該找什麼。

f[0] // {name: 'test'} 
f['test2'] // {name: 'test2'} 
+0

你必須爲此使用和實現一個單獨的get()方法。 – Sirko 2013-02-17 10:39:58

+0

如果'var list = [{name:'test'},{name:0}];''f [0]'會返回什麼? – dfsq 2013-02-17 10:41:08

+0

@dfsq它不應該發生,但萬一它應該返回{name:'test'} – 2013-02-17 10:43:48

回答

1

list變量將是私有的f()除非你做的兩件事情之一。

第一個,你可以嘗試返回listf(),這樣你就可以得到你需要的屬性。

function f() { 
    var list = [{name: 'test'}, {name: 'test2'}]; 
    return list; 
} 

var f = f(); 
f[0] // {name: 'test'}; 
f['test'] // will return undefined; we'll come back to this 

,我認爲這個選項也可能是你在找什麼,你標有「空中接力」的問題,你可以做f()一個構造函數:

function f() { 
    this.list = [{name: 'test'}, {name: 'test2'}]; 
} 

var f1 = new f(); 
f1['list'][0] // {name: 'test'}; 
f1.list[0] // will also return {name: 'test'}; 
f1.list['test'] // still will return undefined... 

.. 。

您將無法使用['test']['test2']訪問值的原因是因爲它們是您的值,而通常值是我們想要在使用該鍵的對象(在本例中爲['name'].name)。所以你可能想要的是這樣的:

f1.list[0].name // will return 'test' 
f1.list[1].name // will return 'test2' 

希望這會消除混亂。

+0

我已經知道解決我的問題的這些方法,但他們不是我正在尋找的。無論如何,謝謝你,不幸的是,我認爲不可能按照我的想法解決問題。 – 2013-02-17 10:50:15

+0

代碼的目的是什麼?我可能會幫助... – guypursey 2013-02-17 10:51:20

+0

我在寫一個使用webSocket與服務器交互的客戶端。問題是我有一個名爲ChannelList的對象的通道列表(它類似於IRC)。該對象裏面有一個列表channels = []和一些方法。下面是一段代碼,如果有幫助的話:http://jsbin.com/isejuh/1/edit – 2013-02-17 10:56:27

0

只要使用的不是數組對象:

var byname = { 
    "test": {name: 'test'}, 
    "test2": {name: 'test2'} 
}; 
// bracket notation: 
byname["test2"] // {name: 'test2'} 
// dot notation: 
byname.test // {name: 'test'} 

既然你說你永遠不會通過索引來訪問結構,這將是確定使用無序的鍵 - 值映射結構。爲了節省打字的時間,你也可以從你的數組中動態地創建這個對象:

var list = [{name: 'test'}, {name: 'test2'}]; 

var byname = {}; 
for (var i=0; i<list.length; i++) 
    byname[list[i].name] = list[i];