//グローバルにHogeって領域を確保
Hoge = {};//機能ごとに名前を分ける
Hoge.greeting =
{
sayHello: function (word)
{
var msg = word || "Hello";
alert(msg);
},
sayDate: function ()
{
alert(new Date.getTime());
}
}
Hoge.exercise = {};
だけどPrototype-basedなクラス定義がしたくなったし、クラス化したほうが
使いやすくできそうな気がした。
新規にクラスを宣言する方法はいくらかあるけど、自分が気に入った方法を覚書しとく。
まず、メンバ変数の定義。
function MyHogeClass() //クラス名だけ定義
{
this.initialize.apply(this, arguments);
//initializeはまだ定義してないけどインスタンスをまだつくってないのでエラーじゃない
//this(MyHogeClass)に与えられた引数オブジェクト(arguments)をinitializeに渡す。
}
MyHogeClass.prototype =
{
initialize: function(word)
{
this.word = word;//メンバ変数の定義
},
sayHello: function(value)
{
var word = value || this.word || "Hello";
alert(word);
}
};
こうするとメンバ変数とメソッドをひとつの中括弧で囲えて見やすい。
メソッドごとに
MyHogeClass.prototype.sayName = function {alert("Hello")}
って書くと中括弧の入れ子が少ないって意味ですっきりしてるけど慣れない。
あと基本事項だけどスーパークラスにprototypeで付け足すと子オブジェクト自体も
変更されるがただの代入だとそのオブジェクトしか変更されない。
んで継承は
MyHogeClass.prototype = SuperClass.prototype;
は間違い。スーパークラスの参照とサブクラスの参照を同じにしたからサブクラスの変更が
スーパーラスに反映される。
MyHogeClass.prototype = new SuperClass();
ならOK…とはいえない。Prototype-basedじゃない。けどしょうがない。
どうもClass-basedなクラス定義で育った現代っ子としてはPrototype-basedに慣れない。