2016-09-12 10 views
1

プロトタイプの継承の基本をクリアしようとしています。コンストラクタで設定されたプロパティがプロトタイプのプロパティをオーバーライドします

function thirdSampleObject(){ 
    this.first_var = 3; 
    this.update = function(){"Hi I am a function"}; 
} 

var thirdClass = new thirdSampleObject(); 
var fourthClass = new thirdSampleObject(); 

thirdClass.first_var = 5; 
fourthClass.first_var = 7; 


console.log(thirdClass.first_var); //returns 5 
console.log(fourthClass.first_var); //returns 7 

thirdSampleObject.prototype.first_var = 10; 

console.log(thirdClass.first_var); //returns 5 "protectected" within it's own instance of the object 
console.log(fourthClass.first_var); //returns 7 "protectected" within it's own instance of the object 

var fithClass = new thirdSampleObject(); 
console.log(fithClass.first_var); //returns 3 ? Wouldn't this return 10 at this point?` 

私は、プロトタイプの値を上書きするのでconsole.log(fithClass.first_var)が10を返すことを期待します。ただし、元のプロトタイプ定義で設定された番号を返します。なぜか私の頭を包み込むことを試みている。

+0

インスタンスプロパティを設定します。そのプロパティは、プロトタイプに設定されたプロパティを常に覆しています。 – Sirko

+2

"コンストラクタで設定されたプロパティがプロトタイプのプロパティをオーバーライドしています"などの意味のあるタイトルを質問に付ける必要があります。 –

+0

コンストラクタ内の割り当てはプロトタイプとは関係ありません。コンストラクタの 'this'の値は新しいオブジェクトであり、プロトタイプではありません。 – Pointy

答えて

4

プロトタイプのfirst_varの値にかかわらず、コンストラクタは新しく作成されたオブジェクトの値を明示的に設定します。

コンストラクタ内のコードは、コンストラクタ外のコード内のそれらの割り当てとまったく同じことを行っています。コンストラクタ関数のコードは単なるコードであり、コンストラクタではthisはプロトタイプではなく新しいオブジェクトを参照します。

+1

入手しました。一緒に私の頭の中で適切な動きのeverytingを設定する簡単なデモをハッキング。非常に感謝しています! – dima

+0

@dimaそれを聞いてうれしい! – Pointy

1

オブジェクトにプロパティがなく、そのオブジェクトのプロトタイプにプロパティがある場合、プロトタイプの継承が発生します。

function thirdSampleObject(){ 
    this.first_var = 3; 
    this.update = function(){"Hi I am a function"}; 
} 
thirdSampleObject.prototype.first_var = 10; 

var fifthClass = new thirdSampleObject(); 

fifthClass.hasOwnProperty('first_var'); // returns true. i,e fifthClass object have its own property 'first_var'. 

console.log(fifthClass.first_var); 

delete fifthClass.first_var //here we are deleting the property from object. 

fifthClass.hasOwnProperty('first_var'); // returns false 

console.log(fifthClass.first_var); // returns 10 
関連する問題