javascript作成対象の構造関数モード(二)

4779 ワード

前の章の工場モードにコードを書き換えます.
1  function Human(name, sex) {
2             this.name = name;
3             this.sex = sex;
4             this.say = function () {
5                 alert(this.name);
6             }
7         }
8         var man = new Human("    ", " ");
9         var woman = new Human("    "," ");

Humanを見ましたが、彼の最初の文字が大文字になりました.これは文法的な約束です.コンストラクタはいつも大文字で始まるべきです.コンストラクタではなく、小文字で始まります.コンストラクタと非コンストラクタを区別するために使います.
Humanを作成するにはnewオペレータを使用しなければなりません.これは以下の4つのステップがあります.
1.新しいオブジェクトまたは変数を作成します.
2.構造関数のスコープを新しい変数または新しいオブジェクトに割り当てます.
3.コンストラクタのコードを実行する
4.新しいオブジェクトを返します
 
1 alert(man instanceof Object);//true
2 alert(man instanceof Human); //true
3 alert(woman instanceof Object); //true
4 alert(woman instanceof Human); //true
ここのtrueはよく説明しています.カスタムのコンストラクタを作るということは、将来彼の実例を特定のタイプとして表現することができるということです.これはまさに韓国式モデルを構築するところが工場モデルより優れています.
それでも、コンストラクタは自分の欠点を持っています.あるいは足りないと言ってもいいです.
マンとウーマンの中にはsay()という方法がありますが、彼らの機能は同じです.しかし、この二つの方法は同じFunction()の実例ではないです.
1 function Human(name, sex) {
2             this.name = name;
3             this.sex = sex;
4             this.say = new Function("alert(this.name);");
5         }
これは、n個のインスタンスが必要であれば、n個のsayのFunction()インスタンスを作成することを意味し、それでもリソースの浪費をもたらす.
上のコードを引き続き最適化して、このsay()方法を一回だけ作成させます.一つの参照を共有します.
1 function Human(name, sex) {
2             this.name = name;
3             this.sex = sex;
4             this.say = say;
5         }
6         function say() {
7             alert(this.name);
8         }
sayは指向関数の指針を含むので、Humanの例はグローバルスコープの同じsay()関数を共有しているが、これは許容できない.
システムが巨大であれば、多くのグローバル変数が発生しますので、不注意で改変される危険があります.
次にプロトタイプがあります.次の章でプロトタイプを話します.