正确扩展数组,保留子类的实例

时间:2014-03-18 18:22:21

标签: javascript inheritance coffeescript prototypal-inheritance

我已经编写了一个类,尝试使用自定义类扩展本机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 个答案:

答案 0 :(得分:1)

  

为什么myInstance.first() instanceof MyClass不返回true?

由于first调用sliceArray.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