javascript対象のpropertyとprototypeはこのような関係です.
4487 ワード
もっと読む
ECMAScriptは二つのタイプのオブジェクトを識別できます.一つはNative Objectといって言語の範疇に属します.1つはHost Objectといい、動作環境により例えばdocumentオブジェクトを提供し、
Dom Nodeなど
Native objectは、緩い構造であり、属性を動的に増やすことができます.すべての属性には名前と値があります.この値は他のオブジェクトの参照となります.
または内部に構築されたデータタイプ(String,Number,Boolean,NullまたはUdefined)
以下のこの簡単な例は、Javascriptオブジェクトが属性の値をどのように設定し、属性の値をどのように読み取りますか?
割り当て操作
オブジェクトの属性の作成は非常に簡単で、直接に値付け操作で属性の作成ができます.
値を取る操作
値を取って操作する中でpropertyとprototypeは違っています.一番簡単なpropertyで値を取って操作します.
[color=blue]
しかし、すべての対象者にプロトタイプがあります.プロトタイプは自分も対象です.彼にプロトタイプがあります.このように循環してプロトタイプチェーンができます.
このチェーンは彼がチェーンの中の隊形のプロトタイプがnullに会った時に中止します.(Objectのデフォルトのprototypeはnull)
私たちは下のコードを見ています.
このプロトタイプはObjectのデフォルトのプロトタイプで、Object.prototypeのプロトタイプはnullです.これでこのプロトタイプのチェーンは終了します.
値を取る操作が発生すると、objectRefの全体のprototypeチェーンは動作を開始します.
のプロパティをチェックすると、このオブジェクトのプロトタイプ、objectRefのプロトタイプはMyObject 1オブジェクトで、このオブジェクトはtestNumberという属性があるので、valは8の値を得ます.
だからObject.prototypeは戻ります.
読み操作は、obj自身とprototypeチェーンで発見された最初の同名属性値を読みます.
書き込み操作は、objオブジェクト自体に同名の属性を作成します.この属性名が存在しない場合は、
これはobject Ref.testNumber=3がobject Refオブジェクトにpropertyを作成します.名前はtestNumberです.今度はtestNumberを読もうとしています.
propertypeチェーンは動作しません.Object Refのproperty 3だけが得られます.MyObject 1のtestNumber属性は修正されません.以下のコードは検証できます.
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]