2013-10-15 71 views
0

由於遞歸無限循環,首先不能發生下面的代碼。我想重寫數組上的推送函數。使用Coffeescript我希望能夠推入具有ID的對象,並確保它們在將它們添加到數組之前是唯一的。問題是,我無法找到我應該添加此對象的變量。覆蓋array.push Coffeescript

如何將對象添加到超級數組?

class SpecialArray extends Array 
    Array::push = (arg) -> 
    added = $.grep @, (item) -> 
     if item 
      item.id == arg.id 
    if added <= 0 
     @push.call(@,arg) // won't work due to loop 

當我運行這段代碼,我得到的錯誤: enter image description here

+0

什麼循環?另外,你是否在尋找'added.length'? – Bergi

+0

您[無法擴展'Array'](http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array)。 – Bergi

+0

@Bergi我可以看到它是如何導致問題的。我能夠弄清楚,只是創建另一種方法,然後在最後調用push而不是重寫作品。我仍然想要Array的功能,我只需要添加額外的功能。 – Rizowski

回答

0

你不應該覆蓋Array::push。就你而言,你甚至可以遞歸地調用它。

我認爲你正在尋找

class SpecialArray extends Array 
    constructor:() -> 
    ref = super 
    ref.push = push 
    ref 
    push = (arg) -> 
    unless !arg.id or arg.id in (item.id for item in @) 
     Array::push arg 

compile

注意,但是new SpecialArray不是instanceof SpecialArray,而是一個普通的Array,它的覆蓋push方法不處理多個參數。

+0

@LieuweRooijakkers:感謝編輯建議,但我的意思是指派原型方法聲明。在之前的CoffeeScript版本中,'super'似乎一直在那裏工作。 – Bergi