大きな古時計の歌をJavaScriptで書きました


---------------------------------------
[Gist]
[https://gist.github.com/TatsuoWatanabe/2d369f739348e45da3aaa393821c3dab](https://gist.github.com/TatsuoWatanabe/2d369f739348e45da3aaa393821c3dab)

---------------------------------------

# 実行方法 
※ 歌いません。ログが出るだけです。
### ブラウザ
ブラウザ(ES6対応)の場合は developer console 上にソースコードを全文貼り付けてEnterで実行できます。

### node.js
node.js	 実行環境がある場合はコマンドで実行できます。

```
node grandfathers-clock.js
```


# ポイント解説
## TickTackableクラスの継承
おじいさんと時計は一緒にチックタックすることができるので、TickTackableクラスを継承します。

```js:grandfathers-clock.js
class TickTockable {
  constructor(opts) {
    const options = opts || {};
...
```

```js:grandfathers-clock.js
class Oldman extends TickTockable {
  constructor(clock, opts, name) {
    super(opts);
...
```

```js:grandfathers-clock.js
class Clock extends TickTockable {
  constructor(opts) {
    super(opts);
...
```

## おじいさんの初期状態

```js:grandfathers-clock.js
class Oldman extends TickTockable {
  constructor(clock, opts, name) {
    super(opts);
    this.name   = name;
    this.clock  = clock;
    this.isBorn = false;
    this.alive(() => this.tick());
  }
...
```

おじいさんは初期状態ではまだ生まれていません。
チックタックした時に心音は確認できる状態です。
また、コンストラクタで受け取った時計と運命的に紐づけられてはいますが、まだ未購入です。

## おじいさんが生まれた時


```js:grandfathers-clock.js
... OldMan Class
  born() {
    if (this.isBorn)   { return; }
    if (!this.rnd(10)) { return; }
    this.isBorn = true;
    this.clock.owner = this;
    this.narrator(`${this.name} was born.`);
  }
```

bornメソッドが実行された時に条件が揃っていればおじいさんが生まれ、
同時に時計のownerプロパティにおじいさん自身がセットされます。


```js:grandfathers-clock.js
... Clock Class
  bought() {
    if (!this.owner || this.isBought) { return; }
    this.isBought = true;
    this.narrator(`The clock was bought for ${this.owner.name}.` );
  }
```

ownerプロパティがセットされると時計は購入された状態になり、おじいさんに所有されます。

## 時計が止まる時

```js:grandfathers-clock.js
... Clock Class
  die() {
    if (!this.owner || this.owner.isAlive) { return; }
    this.isAlive = false;
    setTimeout(() => {
      this.narrator(`The clock stopped short, never to go again.`);
      this.resolve();
    }, this.duration * 2);
  }
```

ownerプロパティにセットされたおじいさんのisAliveプロパティがfalseになると、
時計のisAliveプロパティもfalseにセットされ、時計が止まります。

#実行結果

```
node grandfathers-clock.js 
tick...
My grandfather was born.
mewl...
The clock was bought for My grandfather.
tock...
mewl...
tick...
mewl...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
giggle...
tick...
tock...
tick...
tock...
yeah...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
Blooming and beautiful bride came.
you are my pleasure...
tock...
tick...
tock...
tick...
tock...
tick...
My grandfather had a baby born.
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
My grandfather had a grandchild born.
I was born.
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
what a faithful clock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
tock...
tick...
My grandfather was died.
The clock stopped short, never to go again.
I remember you.

```