这是用例
Ive扩展了Array类:
class ExtendedArray extends Array {
constructor(...args) {
super(...args);
this.test = 10;
}
testTwo() {
}
}
现在,我有一些方法可以映射我的
ExtendedArray
实例并返回另一个ExtendedArray
实例,该实例可以直接使用。但是在其他情况下,我想映射到
ExtendedArray
,但返回一个实际的Array
实例,而不是我的ExtendedArray
。在这种情况下,我认为我可以走__proto__
链并致电.constructor
。这是当我注意到一些意想不到的奇怪行为时。
基于上面的类,我期望这样的层次结构
/*
ExtendedArray
test: 10
__proto__: Object
testTwo: () {}
__proto__: Array
forEach
...
__proto__: Object
...
*/
但是我得到这样的一个:
/*
ExtendedArray
test: 10
__proto__: Array -- Different
constructor: class ExtendedArray
testTwo: () {}
__proto__: Array(0) -- Different
constructor: f Array()
forEach
...
__proto__: Object
...
*/
谁能解释
Array
和Array(0)
之间的区别是原型类型是什么。当数组的构造函数是ExtendedArray
类并且根据类主体定义中的方法创建数组时,为什么第一个原型也是Array的实例。我本来希望以太类型是Object
或ExtendedArray
?任何帮助理解这种行为的方法都将非常有用。
我试图对此进行研究,发现了信息,这些信息解释了不同的类字段和方法在结果对象中的位置,但没有解释原型对象的类型如何解析。
最佳答案
调试器中显示的“类型”是毫无意义的。他们只是试图对实例有所帮助,但通常会导致原型对象混乱。它们在浏览器之间也有所不同,并且经常在devtools版本之间进行更改。
所有这些值都只是对象,它们的结构和原型链正是您所期望的。
Array
和Array(0)
有什么区别?Array.prototype
对象具有.length = 0
属性。您的ExtendedArray.prototype
尚未。
当第一个原型的构造函数为Array
类时,为什么它是ExtendedArray
的实例。我本来希望以太类型是Object
或ExtendedArray
?
它不是ExtendedArray
实例-它不继承自ExtendedArray.prototype
(因为它是ExtendedArray.prototype
)。就像{constructor: ExtendedArray}
这样的对象。
但是,它确实是从Array.prototype
继承的,因此这就是“类型”。