JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

javascriptでシンプルな差分プログラミングのやり方が知りたかったのでJavaScript: The Good Partsを立ち読みしに行ってきました。正に俺のような中途半端に書いてる野郎に最適な本だったんですが、薄い本だけど立ち読みだけで理解出来なかったので買って読みました。

とりあえず今まではよくあるプロトタイプ型の継承で書いていたんですが、小クラスから親クラスのメソッド(コンストラクタ含む)を呼ぶやり方がわからず困ってました。(コードが重複したり、コンストラクタに処理を書くのを避けたりして効率が悪かった。)

たとえばこんな感じです。(面倒なのでSpidermonkeyで実行)

#!/usr/bin/env js

function Human() {
  this.name = 'human'
}
Human.prototype.greeting = function() {
  print('Im ' + this.name)
}

function Fukumoto() {}
Fukumoto.prototype = new Human
Fukumoto.prototype.greeting = function() {
  this.parent.greeting() // super()的なことがしたい
  print('Im ' + this.name + '........!!??')
}

var kaiji = new Fukumoto
kaiji.greeting()
/users/komagata/code/proto.js:13: TypeError: this.parent has no properties

この本の「5章 継承 5.4 関数型」に載ってた関数型の継承を使ってみました。(本に載っているのはプライベート変数・プライベートメソッドを導入した更に優れたやり方でしたが、ユルイ代わりにもっと簡単な実装にしてみました。)

#!/usr/bin/env js

var human = function() {
  this.name = 'human'
  this.greeting = function() {
    print('Im ' + this.name)
  }
  return this
}

var fukumoto = function() {
  var superior = human(),
      superior_greeting = superior.greeting,
      that = superior
  that.greeting = function() {
    superior_greeting()
    print('Im ' + superior.name + ' .......!!??')
  }
  return that
}

var kaiji = fukumoto()
kaiji.greeting()
Im human
Im human .......!!??

擬似クラス型やプロトタイプ型はどうも自分のやりたい事にとってオーバー過ぎる気がしてたのでシンプルなやり方に出来てとても嬉しいです。

Comments


Option