This Project Has Not Released Any Files
javascript は基本的にプアな環境でも動くオブジェクト指向言語として設計されている.
Java のような(僕がよく触っているのは Actionscript3 )クラスが無いので大規模開発には向いていない.
しかし実際には大規模開発が行われていてその手法を見ていくと、なんとなくクラスっぽいこともできるよ、という性質が寄与している.
以下の文書はそんな理解の僕が書いてますよ.鵜呑みにしないでよ.
このなんとなくクリスタル、じゃなくて、なんとなくクラス の実現に寄与しているのが prototype 拡張という性質になる. これを使って一度定義した関数や値をインスタンスやサブクラスのインスタンスから何度も再利用している. 結果メモリ効率が良くなる. しかしこのままでは、プライベートな値を持てなかったり、各インスタンスが好き勝手にクラスの定義を書き換えたりもできてしまう.
大規模な js をフレームワークから書く場合、開発者はまず var Class = /* クラス定義 */ から書くことになるのだと思う.(または、最初の規模感があいまいで、コードがでかくなった段階でいよいよクラス定義を追加する場合でも、位置的にはコードの最初に書いて読み込まれるようになるはず.)
プライベートな関数を作れないことを良しとするか?性能を犠牲にしてプライベートを作るか?その場合、どの程度強固にプライベートなプロパティを実装するか?これは結局のところ各開発者の性癖で決まる.
その性癖にしたがってまずは、オレオレクラス定義を書くことになる.
だいたい以上のことができればいいな、ということが version 0.5.x まで書いてきて判明してきました. そして以上の機能を持ったクラス定義コードを書いたのでした.
種類 | Abstract | final | プール | プライベート用クラスの使用 | Super |
通常クラス | 可 | 可 | 可(1) | 可 | 無し |
通常サブクラス | 可 | 可 | 可(1) | 可(2) | 可 |
プライベート用クラス | 可 | 可 | 可(1) | 無し | 無し |
プライベート用サブクラス | 可 | 可 | 可(1) | 無し | 可 |
- var myPrivateClass = Class.create(
- 'myPrivateData', // Class の名前 デバッグで役に立つ、はず、省略可
- CLASS.PRIVATE_DATA | Class.POOL_OBJECT, // Class の設定、省略可
- {
- Constructor : function( name, age ){
- this.name = name;
- this.age = age;
- }
- }
- );
- var myClass = Class.create(
- 'myExampleClass',
- Class.POOL_OBJECT | Class.FINAL,
- myPrivateClass, // プライベート用クラス、省略した場合プライベートクラスは無し
- { // 関数や値
- Constructor : function( msg, name, age ){ // コンストラクタ
- myClass.newPrivateData( this, name, age ); // インスタンスに対してプライベートクラスの生成
- this.msg = msg;
- },
- alert : function(){
- var data = myClass.getPrivateData( this ); // インスタンスに対応するプライベートクラスの取得
- window.aleart( this.msg + data.name + data.age );
- }
- });
クラスは Abstract クラスになる.new AbsClass() とするとエラーになる.
として、サブクラスを作る.inherits() は通常クラスでもできる.
クラスの継承を禁止する.
.kill() で全てのプロパティを削除したインスタンスを保持していて、new では保持したインスタンスを再利用する.
クラス定義時にプライベート用クラスを設定する.
プライベートデータの利用開始には以下のようにする.
一度 newPrivateData したあとは getPrivateData でアクセスする. myClass を隠蔽することでプライベートデータへのアクセスを制限できる.
スーパークラスのプロパティにアクセスできるようになる.スーパークラスのコンストラクタには、書いてない、、、