2016-05-15 17 views
0

は、私は以下のコードの塊があります。私の理解あたりとして今、プロトタイプおよび使用方法のJavascript

function Foo(name){ 
    this.name = name; 
} 

Foo.prototype.myName = function() { 
    return this.name; 
} 

function Bar(name, label){ 
    Foo.call(this, name); 
    this.label = label; 

} 
Bar.prototype = Object.create(Foo.prototype); 

Bar.prototype.myLabel = function(){ 
    return this.label; 
} 

var a = new Bar("a" , "obj a"); 

a.myName(); 
a.myLabel(); 

オーケーを

  1. それは
  2. それが作成する名前を設定する関数Fooを作成しますリンクされたプロトタイプObject of Fooに関数myNameがあります。
  3. これはラベルを設定するだけの関数Barを作成し、Fooの機能を使用して名前を設定します。
  4. 次に、プロトタイプのリンケージがFooとBarの間で確立されます。だから私はFooとBarのためにお互いにリンクされた2つの別々のプロトタイプオブジェクトがあると仮定します。
  5. バーのプロトタイプオブジェクトの内部には、myLabelという機能があります。
  6. 新しいバーを呼び出すと、新しいオブジェクトaが作成され、プロトタイプオブジェクトがバーのプロトタイプにリンクされます。

のでtakewaysは以下のとおりです。

  • のFooのプロトタイプは、1つの機能を得る含まれています - myName

  • はFoo自体はちょうど

  • バーのプロトタイプは、1つを有するされproperty-名前を設定します関数を取得する - myLabel

  • バー自体は、単にプロパティを設定している - mylabelという

  • a'sプロトタイプは、それ自体でFoo's prototypeにリンクされているBar's prototypeにリンクされているオブジェクト。合計で3つのプロトタイプオブジェクトがあります。

このような考え方は正しいですか?ディスカッションを啓発するために何かを修正または追加してください。私はこの言語にはかなり慣れていないし、ニュアンスでも、プロトタイプの使用例/実用例でもほとんどない。その後

Foo.prototype = { constructor: Foo, myName: function() { return this.name}}; 

Barバーのインスタンスに「名前」を適用するために呼び出しFooが新しいBarオブジェクトとしてその二番目のパラメータを設定する前に、むしろそれ自体を行うよりも、構築されている:まずFoo.prototypeを列挙する

+0

*「合計で3つのプロトタイプオブジェクトがあります」* - 正しくはありません。オブジェクト 'a'のプロトタイプは、' Bar.prototype'プロパティによって参照される同じオブジェクトです。 'Bar.prototype'プロパティは' Bar'オブジェクトのプロトタイプではなく、 'new Bar()'で作成されたオブジェクトのプロトタイプになるオブジェクトです。 ( 'Bar'は関数でも、' Bar.prototype'が何を指しているのかと全く関係ない独自のプロトタイプを持つオブジェクトです) – nnnnnn

+0

Ok。 Bar.prototype(または新しい呼び出しの後のオブジェクトのプロトタイプ)とFoo.prototypeは、再び同じプロトタイプオブジェクトを参照しています...正しいのですか? – kushalvm

+0

いいえ、 'Bar.prototype'と' Foo.prototype'は異なるオブジェクトを参照しています。 (申し訳ありませんが、これについて深く説明することは、私がコメントでできることを超えており、徹底的な回答を書く時間がありません。) – nnnnnn

答えて

0

プロパティ。

ただし、{}は、Foo.prototypeから元々継承されています。 Bar.prototype.constructor == Foo; // true

Bar.prototype、例えばのでFooオブジェクトによるBarオブジェクトによる継承ではなく、地元独自のプロパティメソッドmyLabelが、割り当てられています。

ポイント1,2,3は正しいです。

ポイント4が間違っています。 Bar.prototypeFoo.prototypeから継承されるように設定されたプロトタイプ継承があります。 JavaScriptは双方向のプロトタイプ継承をサポートしていません。

ポイント5と6は正しいです。

関連する問題