0

我已經寫了一個類,試圖使用自定義類擴展本機Javascript Array類,我們稱之爲MyClass。這基本上是這樣的:正確地擴展一個數組,保留子類的實例

class MyClass extends Array 

    constructor: (obj) -> @push.apply @, obj 

    first: -> @slice 0, 1 

實例化類是沒有問題的。在控制檯中運行:

var myInstance = new MyClass(["1", "2"]) 
> ["1", "2"] 
myInstance instanceof MyClass 
> true 
myInstance instanceof Array 
> true 

作品已經被驗證。

的問題是,如果我運行:

myInstance.first() 
> ["1"] // as expected 
myInstance.first() instanceof MyClass 
> false // not expected 
myInstance.first() instanceof Array 
> true 

返回值不再MyClass的實例。

我也試過@__proto__.first = @first在構造函數和first: -> @slice.call @, 0, 1。但沒有成功。

爲什麼不myInstance.first() instanceof MyClass返回true

+1

我不認爲擴展數組將會正常工作(http://stackoverflow.com/q/3261587/479863),你爲什麼要這樣做? –

+0

基本上這只是實驗性的,我想看看是否有可能。我不想污染'Array'類,而是想擴充我自己的類。 –

回答

1

爲什麼myInstance.first() instanceof MyClass返回true?

因爲first電話slice,和Array.prototype.slice也始終返回Array。您將需要與把它包裝在MyClass再一個方法來覆蓋它:

class MyClass extends Array 

    constructor: (obj) -> @push.apply @, obj 

    slice:() -> new MyClass super 
    splice:() -> new MyClass super 
    concat:() -> new MyClass super 
    filter:() -> new MyClass super 
    map:() -> new MyClass super 

    first: -> @slice 0, 1 

,並注意subclassing Array does not work

+0

謝謝!解決了這個問題!但是關於內存佔用情況,「新MyClass超級」會消耗多少內存?另外,感謝文章鏈接! –

+0

當然會。然而,你*想要超過'陣列':-) – Bergi

+0

是的,我完全明白這一點。我的問題應該是這樣表達的;有沒有辦法一次創建一個新的實例,而不是每次使用例如'slice()'? –