从数组和其他类扩展的Javascript类
如何创建或模拟扩展另一个类和数组的javascript类。我有另一个类从数组和其他类扩展的Javascript类,javascript,arrays,ecmascript-6,es6-class,Javascript,Arrays,Ecmascript 6,Es6 Class,如何创建或模拟扩展另一个类和数组的javascript类。我有另一个类Serializable,它还需要扩展以具有序列化和反序列化函数 class ArrayLikeClass extends Serializable({"_title": "raw"}){ constructor(title){ this._title = title; } /* Serializable adds these: serialize(){...serializes the class}
Serializable
,它还需要扩展以具有序列化
和反序列化
函数
class ArrayLikeClass extends Serializable({"_title": "raw"}){
constructor(title){
this._title = title;
}
/* Serializable adds these:
serialize(){...serializes the class}
static deserialize(){...deserializes the class}
// I don't want to add these in manually */
}
使用这个,我有一个可序列化的类。我怎样才能使方法从Serializable(可序列化)中进行序列化
和反序列化
,同时扩展数组
我将按照可能的副本中的建议使用mixin,但是如何使用mixin来实现静态函数的反序列化呢?在JavaScript中,类是表达式。您可以利用以下优势:
function addSerialize(superclass) {
return class Serialize extends superclass {
// serialize class goes here
}
}
class MyArray extends addSerialize(Array) {
// MyArray stuff goes here
}
好吧,谷歌的贾斯汀·法加尼提出了这种方法。他还写了一篇文章来帮助实现它。如果你想支持
操作符的instanceof
的话,这里是Jared方法的一个扩展,通过定义memoizingSerializable()
:
函数序列化(){
//实施
}
函数反序列化(字符串){
//实施
}
//可选备忘录
const base=new WeakMap()
//使用对象而不是匿名类{},以便可以记住默认值
函数可序列化(基=对象){
//可选备忘录
if(Base.has(Base)){
返回基地。获取(基地)
}
类序列化扩展了基{
静态反序列化(){}
序列化(){}
}
Serialize.deserialize=反序列化
Serialize.prototype.Serialize=序列化
//可选备忘录
Base.set(Base,序列化)
返回序列化
}
//用法
类ArrayLike扩展了可序列化(数组){}
设arrayLike=新的arrayLike()
console.log(类似数组的instanceof数组)//true
console.log(arrayLike instanceof Serializable(Array))//true
Serializable
应该是接口,而不是基类。在JavaScript中,“接口”是通过一种称为“mixin”的常见做法实现的,这应该是一个很好的谷歌搜索术语,用于寻找解决方案。@PatrickRoberts我如何使用mixin使@pfgexport default Serializable的静态方法可能重复({u title:“raw”},class extensed Array{…})
@pfgclass ArrayLikeClass扩展了数组{…}
和ArrayLikeClass.deserialize=Serializable({u title:“raw”})。反序列化
或类似的东西。有没有办法不使用这样的方法提供超类?我假设扩展未定义将抛出一个错误。编辑:将默认超类设置为空类,其工作原理应该与此mixin方法通过在接口实现的中间插入一个额外的prototype
来模拟多重继承的方式类似+1@pfg当然,只需传递一个空类:const Serialize=addSerialize(class{})代码>。同样,ES 6 JavaScript中的类是一流的:您可以将它们分配给VAR、作为参数传递、从函数返回等等。@pfg您遇到的核心问题是JavaScript中不支持多重继承,因为继承是基于原型的。老实说,这是解决这个问题的一种非常优雅的方法,虽然还有其他方法,但这似乎是您尝试执行的最有效的方法。唯一的缺点是您需要更多的代码,具体实现Symbol.hasInstance
,以支持一个语义instanceof
操作符,该操作符假装正在进行多重继承。喜欢使用对象
作为默认值。