関数指向から覚えるオブジェクト指向

javaScriptの勉強をしながらオブジェクト指向が分かっちゃう!(対象読者レベル:JavaScript中級以上で、オブジェクト指向を理解していること)

関数が値である

JavaScriptの世界では、関数も値である。ある意味これが一番の特徴になっているといってもいい。値であるから、変数に代入することができる。関数の実行は括弧で引数を関数に与えることで実行される。

var plus = function(a,b){ return a+b };
var three = plus(1,2);

戻り値にも関数が使える。

function plus_func(){
  return function(a,b){ return a+b };
}
var plus = plus_func();
var three = plus(1,2);

ハッシュ

ハッシュ(連想配列)は {} で作ることができる。

var hash={};
hash['hoge'] = 1;
var obj = hash['hoge'];

ハッシュの値はドットを利用した構文でも利用できる。以下の例文は先の例文と全く同じ意味である。

var hash={};
hash.hoge = 1;
var hash = hash.hoge;

当然ハッシュの値には関数も指定できる。

var hash={};
hash.plus = function(a,b){ return a+b};
var three = hash.plus(1,2);

変数のスコープ

関数はどこでも定義でき、その関数の中ではその関数が定義されたスコープで使える変数が全て使える。

var a=1;
var plus = function(b){ return a+b };
var three = plus(2);

さらに、関数を生成したスコープ以外の所で使用した場合でも問題はない。

var make_plus1 = function(){
  var n=1;
  return function(m){ return n+m };
}
var plus1 = make_plus1();
three = plus1(2);

n=1は関数 make_plus1 の中で生成され、make_plus1を抜けた後では利用できなそうだが、利用できるのがJavaScriptなのだ。

関数の変形・引数の束縛

関数に引数を設定した状態にすることを「束縛」という。

var plus = function(a,b){return a+b};
var make_plus1 =function(){
  var n=1;
  return function(m){ return plus(n,m); }
}
var plus1 = make_plus1();
three = plus1(2);

関数 plus の第一引数を1に固定した関数を返す関数make_plus1。上の例では、a=1 がハードコーディングされ固定だが、このようにも書けることに気づいただろうか。

var plus= function(a,b){return a+b};
var make_plus_n=function(n){
  return function(b){ return plus(n,b); }
}
plus1 = make_plus_n(1);
three = plus1(2);

plus2 = make_plus_n(2);
four = plus2(2);

plus3 = make_plus_n(3);
five = plus3(2);

関数の一つめを固定した関数が量産できるのだ。

オブジェクト指向とは

以上の知識で”オブジェクト”が作成可能だ。

function n_plus1(n){
 return n+1;
}
function n_minus1(n){
 return n-1;
}
function new_object(property){
  var object= {}
  object.plus1 = function(){ return n_plus1(property); };
  object.minus1 = function(){ return n_minus1(property); }
  object.set = function(n){property=n};
  return object;
}
obj1 = new_object(1);
var two = obj1.plus1();
var three = obj1.plus2();

obj2 = new_object(1);
var three = obj2.plus1();
var zero = obj2.minus1();
obj2.set(0);
var two = obj2.plus1();

つまりオブジェクトとは

  • 引数を固定した関数と、固定された引数をまとめたもの

である。