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

Javascript 正确扩展数组,保留子类的实例,javascript,inheritance,coffeescript,prototypal-inheritance,Javascript,Inheritance,Coffeescript,Prototypal Inheritance,我编写了一个类,试图用自定义类扩展本机JavascriptArray类,我们称之为MyClass。基本上是这样的: class MyClass extends Array constructor: (obj) -> @push.apply @, obj first: -> @slice 0, 1 实例化这个类没有问题。在控制台中运行此命令: var myInstance = new MyClass(["1", "2"]) > ["1", "2"] myInstan

我编写了一个类,试图用自定义类扩展本机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
与exptected一样工作

问题是,如果我运行:

myInstance.first()
> ["1"] // as expected
myInstance.first() instanceof MyClass
> false // not expected
myInstance.first() instanceof Array
> true
返回的值不再是MyClass的实例

我还尝试了构造函数中的
@\uuuu proto\uuu.first=@first
,以及
first:->@slice.call@,0,1
。但是没有成功

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

为什么MyClass的
myInstance.first()instanceof
不返回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

请注意。

我认为扩展数组永远不会正常工作(),为什么要尝试这样做?基本上这只是实验性的,我想看看是否可能。我不想污染
数组
类,而是想扩展我自己的类。谢谢!这就解决了问题!然而,关于内存占用,
newmyclass super
会不会消耗更多的内存?另外,谢谢你的文章链接!当然会的。然而,你想要的不仅仅是一个
数组
:-)是的,我完全明白。我的问题应该这样表述;是否有一种方法可以创建一个新实例一次,而不是每次使用,例如
slice()
?我不明白,
slice
的目的是返回一个不同的新实例?你想让它改变你的实例吗?不,它不会修改。所有其他发生变异的数组方法(如
sort
push
shift
,…)都可以在
MyClass
实例上正常工作。