2014-03-24 41 views
3

在咖啡腳本中,我有這個小小的代碼片段。對象的數組訪問Javascript

class Collection 

    construct:(@collection=[]) 

現在我想訪問該對象,就好像它是一個數組,但我想要得到的集合變量,當我這樣做。在其他語言中,我會實現某種類型和代碼的了ArrayAccess下一首,當前等方法

obj= new Collection([1,2,3]) 

obj[0] # this should equal 1 

我怎樣才能做到這一點在JavaScript或CoffeeScript中要麼會做

回答

1

那是不可能的。你需要某種proxy。沒有「ArrayAccess」聲明功能,因爲支架符號只是您的Collection實例(如obj["collection"])上的屬性訪問。

相反,可以:

  • 實現吸氣劑的功能,如

    class Collection 
        construct:(@collection=[]) 
        at: (i) -> 
        @collection[i] 
    
    obj.at 0 # 1 
    
  • 使用Collection對象本身作爲元件的保持器(例如像jQuery不會它)。不過,你放棄了本地數組功能。你甚至可能subclass Array to some extent.length不會自動更新)。

    class Collection 
        constructor: (col = []) -> 
        @length = 0 
        for el in col 
         Array::push.call(@, el) 
    
    obj[0] # 1 
    
+0

在at是個好主意。也許再加上所有的foreach循環。 –

+1

@Lpc_dark:'each' please,'all'是['every']的常用同義詞(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every ) – Bergi