2014-03-24 42 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