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