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