javascript対象のpropertyとprototypeはこのような関係です.


もっと読む
ECMAScriptは二つのタイプのオブジェクトを識別できます.一つはNative Objectといって言語の範疇に属します.1つはHost Objectといい、動作環境により例えばdocumentオブジェクトを提供し、
Dom Nodeなど
Native objectは、緩い構造であり、属性を動的に増やすことができます.すべての属性には名前と値があります.この値は他のオブジェクトの参照となります.
または内部に構築されたデータタイプ(String,Number,Boolean,NullまたはUdefined)
以下のこの簡単な例は、Javascriptオブジェクトが属性の値をどのように設定し、属性の値をどのように読み取りますか?
割り当て操作
オブジェクトの属性の作成は非常に簡単で、直接に値付け操作で属性の作成ができます.

var objectRef = new Object(); //create a generic javascript object.
testNumberという属性はこのように作成できます.

objectRef.testNumber = 5;
/* - or:- */
objectRef["testNumber"] = 5;
コピーした属性名が既に存在する場合は、この属性は再作成されません.

objectRef.testNumber = 8;
/* - or:- */
objectRef["testNumber"] = 8;
js対象のプロトタイプは自分自身も対象としても良いし、属性があってもいいし、js対象の赋値操作は一般的な対象属性の作成とあまり変わりません.
値を取る操作
値を取って操作する中でpropertyとprototypeは違っています.一番簡単なpropertyで値を取って操作します.

/*          ,            ,        ,            */
objectRef.testNumber = 8;
/*          */
var val = objectRef.testNumber;

/*   val         objectRef  8 */
prototypeの開示
[color=blue]
しかし、すべての対象者にプロトタイプがあります.プロトタイプは自分も対象です.彼にプロトタイプがあります.このように循環してプロトタイプチェーンができます.
このチェーンは彼がチェーンの中の隊形のプロトタイプがnullに会った時に中止します.(Objectのデフォルトのprototypeはnull)

var objectRef = new Object(); //create a generic javascript object.
新しいjsオブジェクトを作成します.この時、このオブジェクトのプロトタイプはNullです.だから、Object Refのプロトタイプチェーンは一つのオブジェクトObject.prototypeだけを含みます.
私たちは下のコードを見ています.

/*   MyObject1         
   MyObject1 - type.
*/
function MyObject1(formalParameter){
    /*              testNumber
    */
    this.testNumber = formalParameter;
}

/*   MyObject2         
   MyObject2 - type:-
*/
function MyObject2(formalParameter){
   /*              testString*/
    this.testString = formalParameter;
}

/*         MyObject1     MyObject2   prototype  */
MyObject2.prototype = new MyObject1( 8 );

/*       MyObject2       */

var objectRef = new MyObject2( "String_Value" );
このMyObject 2タイプのオブジェクトはprototypeのチェーンがあり、チェーンの最初のオブジェクトはMyObject 1オブジェクト、MyObject 1オブジェクトもprototypeがあります.
このプロトタイプはObjectのデフォルトのプロトタイプで、Object.prototypeのプロトタイプはnullです.これでこのプロトタイプのチェーンは終了します.
値を取る操作が発生すると、objectRefの全体のprototypeチェーンは動作を開始します.

var val = objectRef.testString;
object Refという対象の属性はtestStringといいます.このコードはtestStringの値をvalに与えます.

var val = objectRef.testNumber;
このオブジェクトにはtestNumberという属性はありませんが、valはundefineではなく、8値になりました.
のプロパティをチェックすると、このオブジェクトのプロトタイプ、objectRefのプロトタイプはMyObject 1オブジェクトで、このオブジェクトはtestNumberという属性があるので、valは8の値を得ます.

var val = objectRef.toString;
今はvalはfunctionの引用です.このfunctionはObject.prototypeのpropertyです.MyObject 1とMyObject 2はtostringというpropertyを定義していません.
だからObject.prototypeは戻ります.

var val = objectRef.madeUpProperty;
最後のvalはundefinedです.MyObject 1とMyObject 2、そしてObjectはmadeUpPropertyというpropertyを定義していないので、undefineを得ました.
読み操作は、obj自身とprototypeチェーンで発見された最初の同名属性値を読みます.
書き込み操作は、objオブジェクト自体に同名の属性を作成します.この属性名が存在しない場合は、
これはobject Ref.testNumber=3がobject Refオブジェクトにpropertyを作成します.名前はtestNumberです.今度はtestNumberを読もうとしています.
propertypeチェーンは動作しません.Object Refのproperty 3だけが得られます.MyObject 1のtestNumber属性は修正されません.以下のコードは検証できます.

/*   MyObject1         
   MyObject1 - type.
*/
function MyObject1(formalParameter){
    /*              testNumber
    */
    this.testNumber = formalParameter;
}

/*   MyObject2         
   MyObject2 - type:-
*/
function MyObject2(formalParameter){
   /*              testString*/
    this.testString = formalParameter;
}

/*         MyObject1     MyObject2   prototype  */
var obj1 = new MyObject1( 8 );
MyObject2.prototype = obj1;

/*       MyObject2       */

var objectRef = new MyObject2( "String_Value" );

alert(objectRef.testNumber);
objectRef.testNumber = 5;
alert(objectRef.testNumber);
alert(obj1.testNumber);
[/color]