ユーザ用ツール

サイト用ツール


javascript:class

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

次のリビジョン
前のリビジョン
javascript:class [2010/02/08 05:43] – 外部編集 127.0.0.1javascript:class [2025/09/09 16:23] (現在) – 削除 nullpon
行 1: 行 1:
-====== クラス ====== 
-JavaScriptにはクラスはないが、関数オブジェクトをコンストラクタとして呼び出すことができる。 
- 
-===== Functionオブジェクト ===== 
-関数を定義すると、新しい Function オブジェクトが作成されます。 
-<code javascript> 
-function ClassA(){ 
-} 
-window.alert(ClassA instanceof Function);  // true 
-</code> 
- 
-===== クラスを定義とインスタンス作成 ===== 
-Functionオブジェクトに演算子 new を使うと新しいインスタンスを作成できます。Function オブジェクトはコンストラクタとして働きます。 
-<code javascript> 
-function MyClass(){ 
-} 
-var my = new MyClass(); 
-window.alert(my instanceof MyClass);       // true 
-window.alert(my.constructor == MyClass);   // true 
-</code> 
-インスタンス my の constructor プロパティは 関数オブジェクト MyClass となり、my は MyClass のインスタンスとみなされます。 
- 
-===== メソッド定義 ===== 
-コンストラクタは prototype プロパティを持っており、 prototype に関数オブジェクトをセットすることで、インスタンスのメソッドとなります。 
-<code javascript> 
-function MyClass(){ 
-} 
-MyClass.prototype.execute = function () { 
-    window.alert("hoge"); 
-}; 
-var my = new MyClass(); 
-my.execute();     // hogeと表示 
- 
-var my2 = new MyClass(); 
-my2.execute();    // hogeと表示 
-</code> 
- 
-インスタンスに直接メソッドを付加することもできます 
-<code javascript> 
-// インスタンス自身にメソッドを定義 
-my.execute2 = function () { 
-   window.alert("fuga");  
-}; 
-my.execute2();     // fugaと表示 
-my2.execute2();    // my2はメソッドexecute2を持たないのでエラー 
-</code> 
- 
-==== プロトタイプチェイン ==== 
-メソッドを呼び出すと、まずインスタンス自身が呼び出されたメソッドを持っていないかチェックし、持っていればそれを実行します。 
-<code javascript> 
-function Hoge() { 
-} 
-var hoge = new Hoge(); 
-hoge.execute = function() { alert("あ") }; 
- 
-hoge.execute();  // "あ"と表示される 
-</code> 
-インスタンス自身がメソッドをもっていない場合は、コンストラクタのprototypeからメソッドを探して呼び出します。 
-<code javascript> 
-function Fuga() { 
-} 
-Fuga.prototype = hoge; 
- 
-var fuga = new Fuga(); 
-fuga.execute();  // プロトタイプ(hoge)のexecuteメソッドが呼ばれ、"あ"と表示される。 
-</code> 
- 
-コンストラクタのprototypeもメソッドを持っていない場合は、prototypeオブジェクトのコンストラクタのprototypeを探して呼び出します。 
-<code javascript> 
-function Piyo() { 
-} 
-Piyo.prototype = new Fuga(); 
- 
-var piyo = new Piyo(); 
-piyo.execute();  // プロトタイプ(Fugaのインスタンス)のプロトタイプ(hoge)の execute メソッドが呼ばれ、"あ"と表示される。 
-</code> 
- 
-このようにプロトタイプをさかのぼってメソッドを探す仕組みをプロトタイプチェインと呼びます。 
- 
- 
-===== プロパティの定義 ===== 
-代入式を実行した時点でプロパティが生成されるのでプロパティを宣言をする必要はありません。 
-<code javascript> 
-function MyClass(){ 
-    this.hoge = "ホゲ";     // プロパティhogeが生成 
-} 
-MyClass.prototype.printHoge = function () { 
-    print(this.hoge);     
-} 
-MyClass.prototype.printFuga = function () { 
-    print(this.fuga);     
-} 
-MyClass.prototype.setMohe = function (mohe) { 
-    this.mohe = mohe;                 
-} 
-var my = new MyClass(); 
-my.printHoge(); 
-my.fuga = "ふが"; 
-my.printFuga(); 
-my.setMohe("モゲ"); 
-print(my.mohe); 
-</code> 
-メソッドやプロパティは全て外部から自由にアクセス可能。内部表現の隠蔽は難しい(できなくはない…) 
- 
-===== クラス定義 ===== 
-最近では prototype にメソッドを一つずつセットしていくよりも、prototypeプロパティそのものを書き換えてしまうことが多い。このときinitializeというメソッドを定義して、コンストラクタで呼び出す作法が一般的。 
-<code javascript> 
-function MyClass(arg){ 
-    this.initialize(arg); 
-} 
-MyClass.prototype = { 
-    initialize: funtion(arg) { 
-       this.hoge = arg; 
-    } 
-    printHoge: function() { 
-        print(this.hoge); 
-    }, 
-    printFuga: function () { 
-        print(this.fuga);     
-    }, 
-    setMohe: function (mohe) { 
-        this.mohe = mohe;                 
-    } 
-}; 
-var my = new MyClass("ほげ"); 
-my.printHoge(); 
-my.fuga = "ふが"; 
-my.printFuga(); 
-my.setMohe("モゲ"); 
-window.alert(my.mohe); 
-</code> 
- 
-===== 無名関数からクラスを生成 ===== 
-無名関数もコンストラクタになる。 
-<code javascript> 
-var MyClass = function(arg) { 
-    this.initialize(arg);     
-} 
-MyClass.prototype = { 
-    initialize: function(arg) { 
-        this.hoge = arg; 
-    }, 
-    inspect: function() { 
-        print(this.prototype); 
-        print(this.constructor); 
-        for (var i in this) { 
-            print (i + "=" + this[i]); 
-        } 
-    } 
-} 
- 
-var my = new MyClass(1000); 
-my.fuga = "fugafuga"; 
-my.inspect(); 
-</code> 
  
javascript/class.1265607815.txt.gz · 最終更新: (外部編集)