2016-05-28 6 views
3

自分自身について説明していると思います。私は、コンストラクタオブジェクトの内部にあるプロトタイプのオブジェクトの内部にある特定のプロパティを取得しようとしています。私がそれを取り出すことができなければ、誰かがなぜ私ができないのか説明してくれることを願っています。ここでjsfiddleコンストラクタ関数内にあるプロトタイプのオブジェクトからプロパティを取得する方法

Javascriptを

からコード
function animal() { 
    this.name = "animal"; 
    this.action = "acting"; 
    this.active = function() { 
     var txt = "This " + this.name + ", is " + this.action; 
     attach('ex1', txt, 'p'); 
    } 

} 

function print(value) { 
    document.getElementById('ex1').innerHTML += value; 
} 

function Human() { 
    animal.call(this); 

    Human.prototype = { 
     name: "human", 
     action: "conquering" 

    } 

} 



var bob = new Human; 

print(bob.name); 
+0

プロトタイプチェーンは 'animal'と' Human'は、ここにありませんが、関連はありません。プロトタイプを明示的に 'Human.prototype = new animal();'に設定することを検討してください。 –

+0

ええ、しかし、動物はここでプロトタイプではないと思われます。プロトタイプはコントローラ内に作成されます。 – sielakos

答えて

1

があるそれはあなたが動物に名前をシャドウイングされている、非常に簡単です。 プロパティの取得は、このように動作します。 obj.xを呼び出すと、objのxという名前のプロパティが検索されます。見つかった場合は、そのプロパティの値を返します。そうでなければ、コンストラクタproptotypeのプロパティxを返します。見つからない場合は、プロトタイプオブジェクトのコンストラクタプロトタイプを参照し、最後のプロトタイプ(Object {})まで調べます。見つからない場合は、未定義が返されます。詳細情報については

はここを見て:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

は、だからあなたの場合には、ボブは、プロパティ名を持ち、その値は動物です。ヒューマンコントローラでこれに設定されたコンテキストで動物機能を呼び出したときに、このプロパティをbobに追加しました。

多分それは例えば、あなたが理解するのに役立ちますプロトタイプチェーンよりよい:最初のオブジェクトの既存の独自のプロパティと同じ名前を持つあなたは、プロトタイプのオブジェクトのプロパティを取得することができないのはなぜ

function A() { 
 
    this.x2 = 2; 
 
} 
 

 
A.prototype.x3 = 3; 
 

 
function B() { 
 
    this.x1 = 1; 
 
} 
 
B.prototype = new A(); 
 

 
const b = new B(); 
 
const b2 = new B(); 
 
b2.x3 = 'something'; 
 

 
console.log(b.x1); //found on b 
 
console.log(b.x2); //found on B.prototype 
 
console.log(b.x3); //found on A.prototype 
 
console.log(b2.x3); //shadowed by b2.x3

1

...
プロパティをオブジェクトで読み取ると、JavaScriptエンジンは最初に という名前のプロパティを探します。エンジンが という名前の独自のプロパティを正しく見つけたら、その値を返します。その名前のプロパティ がターゲットオブジェクトに存在しない場合、JavaScript は[[Prototype]]オブジェクトを代わりに検索します。その名前のプロトタイププロパティ が存在する場合、そのプロパティの値が返されます。正しい名前のプロパティを見つけずに 検索が終了した場合、 は未定義が返されます。ニコラスC. Zakasによって、オブジェクト指向のJavaScript /の原則から

+0

それは素晴らしい引用です、私がしたことをより良く説明します。 – sielakos

関連する問題