Jsのプロトタイプ


1.prototype(原型)
      JavaScriptでは、私たちが作成した関数ごとにプロトタイプの属性があります.この属性はオブジェクトで、特定のタイプのすべてのインスタンスで共有できる属性または方法を保存する用途があります.すなわち、ある関数Personのプロトタイプに属性または方法を追加すると、Personを構成関数として生成したすべての例が属性または方法にアクセスできる.
	<script type="text/javascript">
		//  Person       Person  
		function Person(){}
		var person1 = new Person();
		var person2 = new Person();

		// Person     name   sayName  
		//            ,           
		Person.prototype.name = "Peter";
		Person.prototype.sayName = function(){return this.name;};
		
		//                
		alert(person1.name);		//Peter
		alert(person2.name);		//Peter
		alert(person1.sayName());	//Peter
		alert(person2.sayName());	//Peter
		
		//               ,prototype            (    )
		person1.name="Billy";
		alert(person1.name);		//Billy
		delete person1.name;
		alert(person1.name);		//Perter
		
		//  hasOwnProperty()               
		alert(person1.hasOwnProperty("name"));//false
		person1.name="Jack";
		alert(person1.hasOwnProperty("name"));//false
	</script>
 
2.原型、構造関数と実例の関係
関数を定義すると、そのデフォルトのプロトタイプオブジェクトが発生します.このプロトタイプオブジェクトは、この関数を指すconstrutor属性を持っています.この関数を使って作成されたすべてのインスタンスの中には、一つのポインターが含まれています.プロト.prototypeオブジェクトを指します(IE 8ではこのポインタにアクセスできません):
	<script type="text/javascript">
		function Person(){}
		alert(Person.prototype);					//[object Object]
		
		//prototype constructor    Person
		alert(Person.prototype.constructor);		//function Person(){}
		alert(Person.prototype.constructor == Person);//true
		
		//        __proto__    Person.prototype
		//IE     
		var person = new Person();
		alert(person.__proto__);					//[object Object]
		alert(person.__proto__==Person.prototype);	//true(IE false)
	</script>
 
3.プロトタイプチェーンと継承
プロトタイプは対象ですので、必ず一つのタイプがあります.プロト.コンパスは構造関数のプロトタイプのオブジェクトを指しています.同じように、このプロトタイプのオブジェクトはもう一つあります.プロト.コンパスは構造関数のプロトタイプオブジェクトを指しています.このようにして、Object.prototypeまで環をします.これはプロトタイプチェーンを構成します.あるインスタンスの属性または方法を呼び出すと、まずこのインスタンスから変数または方法を探して、見つけたら戻ります.さもなくば探しますプロト.指すプロトタイプの対象は、まだ見つけられていないと探し続けます.プロト.指し示すオブジェクトは、プロトタイプチェーンの最後まで見つけられます.私たちはこのようなルックアップによって継承を実現することができます.
		function SuperType(name)
		{
    		this.name = name;
		}
                   
		SuperType.prototype.sayName = function(){
    		alert(this.name);
		};
                   
		function SubType(name, age)
		{  
    		SuperType.call(this, name);
    		this.age = age;
		}
		
     	SubType.prototype = new SuperType();
                   
		SubType.prototype.sayAge = function()
		{
    		alert(this.age);
		};