js対象に向ける動原型方法


最近javascriptの高級なプログラムの設計を読んで、その中の対象の基礎の1章の感じの言うとても良いこと、次にその中の役に立つものを分かち合います.
以下のjs構造類の一例を見てください.
function Car(sColor, iDoors, iMpg) {
                               this.color = sColor;
				this.doors = iDoors;
				this.mpg = iMpg;
				this.showColor = function() {
					alert(this.color);
				}
			}
var oCar1 = new Car('red', 4, 23);
var oCar2 = new Car('blue', 3, 25);
 この方法をコンストラクタ方式と呼ぶ.簡単に説明しますと、このコードは一つのCas類、oCas 1とoCal 2をその二つの対象として宣言しています.このコードはよさそうですが、そのthis.showColor=function(){alert}に注意してください.
thisとは、Carの対象の一つであり、つまり、対象ごとにshowColorの方法があります.これは必ず資源の浪費をもたらします.
もう一つのjs構造類の例を見てください.
function Car(){
}
Car.prototype.color = "red";
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.showColor = function(){
      alert(this.color);
}
var oCar1 = new Car();
var oCar2 = new Car();
この方法をプロトタイプと呼ぶ.この方法は、showColor関数が各オブジェクトによって作成されることを回避し、この関数をすべてのCas類のオブジェクトが共有し、呼び出し時には、thisキーワードを使用してインスタンスオブジェクトのカラーを見つけるという方法にも問題があります.つまり、doorsとmpgはすべてのオブジェクトに共有され、オブジェクトがカラーを変更したら、他のオブジェクトのカラーも対応して変化します.
それでは明らかに両者を結び付けたらいいです.
function Car(){


      this.color = sColor;


      this.doors = iDoors;


      this.mpg = iMpg;


}


Car.prototype.showColor = function(){


      alert(this.color);


}


var oCar1 = new Car();


var oCar2 = new Car();
この方法は混合の構造関数/プロトタイプ法と呼ばれる.
このコードには問題がありません.ダイナミックプロトタイプの方法は何を指しますか?
まず、Javaコードの一部を見に行きます.
class Car {


      public String color = "red";


      public int doors = 4;


      public int mpg = 23;


      public Car(String color, int doors, int mpg){


              this.color = color;


              this.doors = doors;


              this.mpg = mpg;


      }


      public void showColor() {


               System.out.println(this.color);


      }


}
 これは前のjsと似たようなJAvaクラスです.Javaの強い対象向けのメカニズムのために、このような属性と方法の違いを作ってくれました.私たちはすべての方法をclassに書いて、残りのことをjavaで処理します.
jsにもこのjavaとほぼ似たような方法があります.ダイナミックプロトタイプの方法です.
function Car(sColor,iDoors,iMpg){


      this.color = sColor;


      this.doors = iDoors;


      this.mpg = iMpg;


      if(typeof Car._initialized == "undefined"){


              Car.prototype.showColor = function(){


                         alert(this.color);


              }


              Car._initialized = true.


      }


}
 今回はだいぶ楽になりましたね.でも、動原型の方法は継承する時に問題があります.
function Polygon(iSides) {


		this.sides = iSides;


		if(typeof Polygon._initialized == "undefined"){


			Polygon.prototype.getArea = function(){


				return 0;


			}


			Polygon._initialized = true;


		}


	}


	function Triangle(iBase,iHeight){


		Polygon.call(this,3);


		this.base = iBase;


		this.height = iHeight;


		if(typeof Triangle._initialized == "undefined"){


			Triangle.prototype = new Polygon();


			Triangle.prototype.getArea = function(){


				return .5 * this.base * this.height;


			}


			Triangle._initialized = true;


		}


	}


var tri1 = new Triangle(3,4);


alert(tri1.getArea());
 このコードは全然走れません.つまり当
var tri1 = new Triangle(3,4);
実行すると、プログラムはTriangleのコンストラクターに入り、順次実行されます.このときTriangleのオブジェクトはすでに実用化されていますので、再度呼び出します.
Triangle.prototype = new Polygon();


当然間違えます.すなわち,動的プロトタイプ法は中性子類の構造を継承するのに適していない.
修正すればいいです.
function Polygon(iSides) {


		this.sides = iSides;


		this.type = "Polygon";


		if(typeof Polygon._initialized == "undefined"){


			Polygon.prototype.getArea = function(){


				return 0;


			}


			Polygon._initialized = true;


		}


	}


	function Triangle(iBase,iHeight){


		Polygon.call(this,3);


		this.base = iBase;


		this.height = iHeight;


		if(typeof Triangle._initialized == "undefined"){


			Triangle.prototype.getArea = function(){


				return .5 * this.base * this.height;


			}


			Triangle._initialized = true;


		}


	}


	Triangle.prototype = new Polygon();


	var tri1 = new Triangle(3,4);


	alert(tri1.getArea());


       alert(tri1.type);
 要するに、jsは対象に向かうのはjsの重要な関所で、jsの高級な重要な部分で、だから文法の特性は1つの言語の最も重要な部分ではありませんて、モード、設計、OOこれらのものは1つの言語の肝心な点をマスターするのです.extのものを見てもいいです.特にソースコード(今は読めませんでした.)によって、extはswingのようなモードを使って、jsという言葉を使って、このような巨大な対象の倉庫を作ったのはなんと強大ですか?