从Array和另一个类扩展的Javascript类

时间:2018-04-30 18:43:04

标签: javascript arrays ecmascript-6 es6-class

如何制作或模拟扩展另一个类和Array的javascript类。我还有另一个类Serializable,它还需要扩展为具有serializedeserialize函数。

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中的方法serializedeserialize来扩展Array

我会按照可能重复的建议使用mixins,但是如何使用mixins来创建静态函数deserialize

2 个答案:

答案 0 :(得分:2)

在JavaScript中,类是表达式。你可以利用这个:

function addSerialize(superclass) {
  return class Serialize extends superclass {
    // serialize class goes here
  }
}

class MyArray extends addSerialize(Array) {
  // MyArray stuff goes here
}

AFAIK,谷歌的贾斯汀法加尼想出了这种方法。他还写了a little helper library来协助实施它。

答案 1 :(得分:2)

如果你想支持instanceof运算符,这里是Jared方法的扩展,允许通过定义Symbol.hasInstance 来记忆Serializable()

function serialize () {
  // implementation
}

function deserialize (string) {
  // implementation
}

// optional memoization
const Bases = new WeakMap()

// use Object instead of anonymous class {} so that default can be memoized
function Serializable (Base = Object) {
  // optional memoization
  if (Bases.has(Base)) {
    return Bases.get(Base)
  }

  class Serialize extends Base {
    static deserialize () {}
    serialize () {}
  }

  Serialize.deserialize = deserialize
  Serialize.prototype.serialize = serialize

  // optional memoization
  Bases.set(Base, Serialize)

  return Serialize
}

// usage
class ArrayLike extends Serializable(Array) { }

let arrayLike = new ArrayLike()
console.log(arrayLike instanceof Array) // true
console.log(arrayLike instanceof Serializable(Array)) // true