ES6 Class 原型 - 类型解析
ES6 Class prototypes - type resolution
这是用例
我扩展了数组 class:
class ExtendedArray extends Array {
constructor(...args) {
super(...args);
this.test = 10;
}
testTwo() {
}
}
现在我有一些方法可以映射我的 ExtendedArray
实例和 return 另一个开箱即用的 ExtendedArray
实例。
然而在其他情况下,我想映射到 ExtendedArray
但 return 一个实际的 Array
实例而不是我的 ExtendedArray
。在这种情况下,我想我可以走上 __proto__
链并调用 .constructor
.
这是我注意到一些我没想到的奇怪行为的时候。
基于上面的 class,我会期待这样的层次结构
/*
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)
之间在原型类型上的区别。还有为什么第一个原型是 Array 的实例,当它的构造函数是 ExtendedArray
class 并且它是基于 class 主体定义中的方法创建时。我原以为 to ether 是 Object
或 ExtendedArray
类型?
如果能帮助理解这种行为,那就太好了。
我试图对此进行研究,并找到了解释不同 class 字段和方法在结果对象中的位置的信息,但没有说明原型对象的类型是如何解析的。
调试器中显示的 "types" 毫无意义。他们只是试图在实例上提供帮助,但通常会导致原型对象的混淆。它们在浏览器之间也不同,并且经常在 devtools 版本之间变化。
所有这些值都是简单的对象,它们的结构和原型链正是您所期望的。
What is the difference between Array
and Array(0)
?
Array.prototype
对象有一个 .length = 0
属性。你的ExtendedArray.prototype
还没有。
Why is the first prototype an instance of Array
when its constructor is the ExtendedArray
class. I would have expected that to ether be an Object
or ExtendedArray
in type?
它不是 ExtendedArray
实例 - 它不是从 ExtendedArray.prototype
继承的(因为它 是 ExtendedArray.prototype
)。它只是一个像 {constructor: ExtendedArray}
.
这样的对象
但是它确实继承自 Array.prototype
,所以这就是显示为 "type"。
这是用例
我扩展了数组 class:
class ExtendedArray extends Array {
constructor(...args) {
super(...args);
this.test = 10;
}
testTwo() {
}
}
现在我有一些方法可以映射我的 ExtendedArray
实例和 return 另一个开箱即用的 ExtendedArray
实例。
然而在其他情况下,我想映射到 ExtendedArray
但 return 一个实际的 Array
实例而不是我的 ExtendedArray
。在这种情况下,我想我可以走上 __proto__
链并调用 .constructor
.
这是我注意到一些我没想到的奇怪行为的时候。
基于上面的 class,我会期待这样的层次结构
/*
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)
之间在原型类型上的区别。还有为什么第一个原型是 Array 的实例,当它的构造函数是 ExtendedArray
class 并且它是基于 class 主体定义中的方法创建时。我原以为 to ether 是 Object
或 ExtendedArray
类型?
如果能帮助理解这种行为,那就太好了。
我试图对此进行研究,并找到了解释不同 class 字段和方法在结果对象中的位置的信息,但没有说明原型对象的类型是如何解析的。
调试器中显示的 "types" 毫无意义。他们只是试图在实例上提供帮助,但通常会导致原型对象的混淆。它们在浏览器之间也不同,并且经常在 devtools 版本之间变化。
所有这些值都是简单的对象,它们的结构和原型链正是您所期望的。
What is the difference between
Array
andArray(0)
?
Array.prototype
对象有一个 .length = 0
属性。你的ExtendedArray.prototype
还没有。
Why is the first prototype an instance of
Array
when its constructor is theExtendedArray
class. I would have expected that to ether be anObject
orExtendedArray
in type?
它不是 ExtendedArray
实例 - 它不是从 ExtendedArray.prototype
继承的(因为它 是 ExtendedArray.prototype
)。它只是一个像 {constructor: ExtendedArray}
.
但是它确实继承自 Array.prototype
,所以这就是显示为 "type"。