関数指向から覚えるオブジェクト指向
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();
つまりオブジェクトとは
- 引数を固定した関数と、固定された引数をまとめたもの
である。