从数组和其他类扩展的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}

如何创建或模拟扩展另一个类和数组的javascript类。我有另一个类
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方法的一个扩展,通过定义memoizing
Serializable()

函数序列化(){
//实施
}
函数反序列化(字符串){
//实施
}
//可选备忘录
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使@pfg
export default Serializable的静态方法可能重复({u title:“raw”},class extensed Array{…})
@pfg
class ArrayLikeClass扩展了数组{…}
ArrayLikeClass.deserialize=Serializable({u title:“raw”})。反序列化
或类似的东西。有没有办法不使用这样的方法提供超类?我假设扩展未定义将抛出一个错误。编辑:将默认超类设置为空类,其工作原理应该与此mixin方法通过在接口实现的中间插入一个额外的
prototype
来模拟多重继承的方式类似+1@pfg当然,只需传递一个空类:
const Serialize=addSerialize(class{})。同样,ES 6 JavaScript中的类是一流的:您可以将它们分配给VAR、作为参数传递、从函数返回等等。@pfg您遇到的核心问题是JavaScript中不支持多重继承,因为继承是基于
原型的。老实说,这是解决这个问题的一种非常优雅的方法,虽然还有其他方法,但这似乎是您尝试执行的最有效的方法。唯一的缺点是您需要更多的代码,具体实现
Symbol.hasInstance
,以支持一个语义
instanceof
操作符,该操作符假装正在进行多重继承。喜欢使用
对象
作为默认值。