【发布时间】:2019-06-23 06:40:08
【问题描述】:
我真的很难创建一个自定义对象,它可以继承数组的所有属性,但行为也与普通实例相同,也就是说,instanceof 和 constructor 的行为就像你想要的那样他们到。我读过类声明只是语法糖,所以我从来没有向它们寻求解决方案(我对它们知之甚少)。
在我取得重大突破之前,我创造了这个可憎的:
function arrayLike() {
let al = [];
//make obj.constructor work
Object.defineProperty(al, 'constructor', {value: arrayLike});
//add methods
//make (obj instanceof arrayLike) == true
return new Proxy(al, {
getPrototypeOf() {
return arrayLike.prototype;
},
})
}
//make (obj instanceof Array) == true
Reflect.setPrototypeOf(arrayLike.prototype, Array.prototype);
碰巧我看到一个非常接近我想做的类示例,然后发现它非常适合这项工作:
class arrayLike extends Array {
//add methods
}
在 Chrome DevToos 中查看,我可以看到我创建的结构与此完全不同。
如果类声明真的是语法糖,那么没有它你怎么创建这个对象呢?
【问题讨论】:
-
我不会说类声明是 100% 的语法糖。在使用 Class 语法的新浏览器中,使用
Array上的.length等神奇属性对特殊对象进行子类化变得更加容易。有什么理由不想使用 Class 语法吗?如果您尝试在旧环境中运行,您可以随时进行转译(并让转译器为您完成所有工作)。 -
@jfriend00 不不,我完全可以使用类语法。我问这个问题纯粹是出于好奇。因为我读到的内容说,没有它,这种结构应该是可能的,我想知道如何。或者我想知道我所读到的内容实际上是错误的,并且确实在类声明中添加了新功能。
-
@Mason 您可以使用
Reflect.construct来创建Array的子类,而无需使用class语法。是的,they're not just sugar。
标签: javascript ecmascript-6 es6-class