「5継承」からのメモ
一般的なクラス型言語では元となるクラスを定義し、そのクラスからオブジェクトを作ります。
var $h = new Hoge();
javascriptはプロトタイプ型言語なので、クラスというものがありません。ではどういう風にオブジェクトを作るのかというと、(僕の勉強した限り)3つの方法があります。
- 疑似クラス型
- プロトタイプ型
- 関数型
疑似クラス型
javascriptにはnew演算子があります。これを使ってクラス型言語のように見える方法でオブジェクトを作ることができます。
/* コンストラクタとなる関数。 new演算子を使って呼び出された場合、 関数内のthidにはグローバルオブジェクトではなく、 新たに作られたオブジェクトがセットされている。 */ var Hoge = function(name) { this.name = name; this.getName = function() { return this.name; }; } var h = new Hoge("hgoehoge"); alert(h.getName()); //"hogehoge"
プロトタイプ型
javascriptのオブジェクトは自身のprototypeプロパティに自身の元となるオブジェクトを保持しています。
自身が持っていないメソッド|プロパティを参照された場合、このprototypeプロパティをさかのぼって参照することになります。
var create = function(prototype) { var F = function(){}; F.prototype = prototype; return new F(); }; var hogeProto = { name : "", getName : function(){ return this.name; } }; var h = create(hogeProto); h.name = "hogehoge"; alert(h.getName());// "hogehoge"
関数型
疑似クラス型、プロトタイプ型ではプライベート(プロパティ|メソッド)を持つことができません。(と思う)
そこでクロージャを使ってそれらを実現した関数型のオブジェクトの作成方法があります。
var hoge = function(name) { var that = {}; //プライベートプロパティ var count = 0; that.getName = function() { countup(); return name; }; that.getCount = function() { return count; } //プライベートメソッド function countup() { count++; } return that; } var h = hoge("hogehoge"); alert(h.getName()); //"hogehoge" alert(h.getName()); //"hogehoge" alert(h.getCount()); //2
クロージャをばりばり使いましょうということらしいです。