如何制作或模拟扩展另一个类和Array的javascript类。我还有另一个类Serializable
,它还需要扩展为具有serialize
和deserialize
函数。
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中的方法serialize
和deserialize
来扩展Array
我会按照可能重复的建议使用mixins,但是如何使用mixins来创建静态函数deserialize
答案 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