ES2015でPrototype

色々残念だ。心より恥じるしかない。

class Product {
  use(str) {}
  createClone() {}
}

class Manager {
  constructor() {
    this.showcase = new Map()
  }
  register(name, product) {
    this.showcase.set(name, product)
  }
  create(name) {
    const product = this.showcase.get(name)
    return product.createClone()
  }
}

class MessageBox extends Product {
  constructor(decoChar) {
    super()
    this.decoChar = decoChar
  }

  use(str) {
    const length = str.length
    let char = ''
    for (let i = 0; i < length + 4; i++) {
      char += this.decoChar
    }
    console.log(char)
    console.log(`${this.decoChar} ${str} ${this.decoChar}`)
    char = ''
    for (let i = 0; i < length + 4; i++) {
      char += this.decoChar
    }
    console.log(char)
  }

  createClone() {
    return this
  }
}

class UnderLinePen extends Product {
  constructor(ulchar) {
    super()
    this.ulchar = ulchar
  }

  use(str) {
    const length = str.length
    console.log(`\" ${str} \"`)
    let char = ''
    for (let i = 0; i < length; i++) {
      char += this.ulchar
    }
    console.log(char)
  }
  createClone() {
    return this
  }
}

const manager = new Manager()
const upen = new UnderLinePen('~')
const mbox = new MessageBox('*')
const sbox = new MessageBox('/')
manager.register('strong message', upen)
manager.register('warning box', mbox)
manager.register('slash box', sbox)

const p1 = manager.create('strong message')
p1.use('Hello, world')
const p2 = manager.create('warning box')
p2.use('Hello, world')
const p3 = manager.create('slash box')
p3.use('Hello, world')

一番の残念ポイントは、オブジェクトのコピーをしていないところ…。
当初、Object.assign(...)を使っていたのですが、フィールドしかコピーされないんですね。(俗にいうシャローコピー)
Function含めてコピーする方法として、lodashやjQuery使うってのもありましたが、 雑に対応しちゃいました。