2016-07-01 4 views
0

私は最近、ちょうどprototypeの紹介を開始したjavascriptの本を読んできました。私はまた.prototype__proto__のいくつかの他のstackoverflowの質問を見てきました、それらはすべて私のためにあまりにも先進的ないくつかの例があり、私はそれらを理解するのに困っています。今、この本は非常に混乱した方法でこれを説明しているので、私はここでそれの基本的な理解を求めると思った。私がちょうど作ったコードを聞きます.prototypeの簡単な使い方は何ですか?

function Person(firstname,lastname){ 
    this.firstname = firstname; 
    this.lastname = lastname; 
} 

Person.prototype.getFullName = function(){ 
    return this.firstname + " " + this.lastname; 
} 
var john = new Person('John','Doe'); 
console.log(john); 

ここで私の混乱が発生するheres。私の理解では、舞台裏ではfunctionにはprototypeがありますが、キーワードnewを使用するまでは実際には再生されません。

私の本から理解できることは、ここで.prototypePerson関数にメソッドを追加できるということです。

クールです。だから私がconsole.log(john.getFullName());をすれば、我々はJohn Doeを得る。ニース!ちょうど疑われる通り。しかし、どうすればいいのですか?console.log(john)Person関数を指しており、firstname: 'John'lastname: Doeを表示します。

ちょうど私がPerson.prototype.getFullNameで追加した方法には何が起こったでしょうか?なぜ我々はJohnをログに記録するのですか?

+0

私が理解しているように、あなたのコードはPersonのプロトタイプに関数を追加しています。代わりに 'console.log(this.prototype)'を使ってみたら、うまくいくはずです。または、未定義の例外をスローします。 –

+0

別のユーザーを作成すると、var john2 = new Person( 'John2'、 'Doe');となります。私はgetFullNameを除くすべてを継承することができる方法はありますか?以来私はconsole.log(john2)それは私が今protoに追加したgetFullNameを継承する? –

+0

@cresjoy、それを部分的に継承する方法はありません。 'john2 = new Person(' ... ')'を実行すると、 'Person.prototype'のすべてが継承されます。 'getFullName'をオーバーライドする場合は、いつでも 'john2.getFullName = function(){.. do something else ..}'を実行できます。これはPerson.prototypeを試す前にjohn2で最初に調べるように動作します。あなたがこれを行う場合、私は参照してくださいPerson –

答えて

1

コンソールに__proto__ドロップダウンを展開すると表示されます。プロトタイプに関数を追加したので、それが表示されます。

Function in prototype

+0

ああ、私は参照してください。私はそれを見ていないとは信じられない。 –

0

Javascriptのワーク内のオブジェクトの各オブジェクトは、定期的な性質firstnameを有するlastnameも(__proto__プロパティで指定された)「プロトタイプ」として使用される通常のオブジェクトにリンクされている「原型継承」によって。あなたがvar john = new Person(...)を行う際にリンク処理が自動的に行われますPerson.prototypeを指定することによって、それはあなたがconsole.log(john)を行うと、あなたが人のインスタンスを作成するとき、それはPerson.prototype

にリンクされなければならない、それだけで直接プロパティが表示されますことを知っていますジョンオブジェクト。

しかし、あなたがjohn.getFullName()を行う際には、JavaScriptの継承モデルは、それがjohnオブジェクトでgetFullNameが見つからない場合は、それはそれを見つけるまで、それは再帰的__proto__でそれを探しますことを知っています。そのため、johnが作成されたときにそのオブジェクトにリンクされていたため、Person.prototypeにはgetFullNameという関数が使用されます。

0

プロトタイプは、JavaScriptの継承に使用されます。このように考える:すべてのオブジェクト(1つを除く)にはプロトタイプがあります。そうでないものはチェーンの一番上にあり、継承階層の終わりです。そのチェーン内のすべてのオブジェクトは、その上にあるすべての関数とプロパティを取得します。これはプロトタイプを通じて行われます。オブジェクトプロトタイプに関数や別の変数を追加すると、それを理解すると、そのオブジェクトのすべてのインスタンスに、それ自身のコピーが渡されます。 Javaスクリプトについては、オブジェクトを作成する方法が約6つあります。新しいキーワードは完全に構文的な砂糖です。それぞれがオブジェクトを作成します。あなたの本は、ある機能や他の機能がオブジェクトであると言っていたはずです。

Javascriptはそれほど混乱しません。それは単に強力で、異なった設計です。その1週間の参照システムは堅牢にしていますが、プログラマーの間違いのためにエラーが発生する可能性もあります。

関連する問題