3

私は JS のプロトタイプの概念を理解しようとしてきましたが、何らかの理由で本当に困惑しています。プロトタイプを使用する理由と時期は?

これの違いは何ですか (このMDN の例から):

function Person(gender) {
  this.gender = gender;
}

Person.prototype.sayHello = function()
{
  alert ('hello');
};

この:

function Person(gender) {
  this.gender = gender;

  this.sayHello = function() {
    alert('hello');
  };
}

使い方は理解できたと思いますが、なぜ使うのかわかりません。多分私は何かが欠けている - それをスクラッチ - 明らかに私は何かが欠けている!

誰かがこれらの 2 つの例の違いと、なぜ一方を他方に使用する必要があるのか​​を説明できますか?

ありがとう!

4

4 に答える 4

1

プロトタイプは継承のために重要です。継承が必要ない場合は、実際には違いはありません。ただし、次の点を考慮してください。

function Person(gender) {
 this.gender = gender;

 this.sayHello = function() {
  alert('hello');
 };
}

function User(){

}

どうすれば aUserになることができPersonますか? ここには本当に簡単な方法はありません。ただし、これはプロトタイプで可能です。

jsFiddle デモ

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

Person.prototype.sayHello = function() {
  alert(this.name);
 };

function User(name){
 this.constructor(name);
}

User.prototype = new Person();

var u = new User("joe");
u.sayHello();//alerts joe

ここで、さらに進んで、次のようなプロトタイプを使用するときにユーザーに挨拶する機能をオーバーライドできます。

jsFiddle デモ

User.prototype.sayHello = function(){ 
 alert("Username: " + this.name);
}
于 2013-04-03T21:24:25.603 に答える
1

クラスと継承。自分で 1、2 時間かけて説明する代わりに、この小さなチュートリアルを読むことを強くお勧めします。プロトタイプのセクションまでスキップしましたが、楽しく説明されています。

于 2013-04-03T20:48:52.153 に答える
1

Personコンストラクターであり、新しいインスタンスが作成されるたびに実行されます。コンストラクターは単なる関数であり、関数は JavaScript の単なるオブジェクトです。関数はf.a = 1、基本的なオブジェクトのようにプロパティを持つことができます: o = {a: 1}.

関数をオブジェクトのプロパティとして追加すると、それはメソッドと呼ばれます。したがってPerson、コンストラクターでメソッドを定義することにより、それらはインスタンス化のたびに再定義されます。すでに指摘したように、これは余分な作業です。

prototype関数のプロパティを使用して事前にメソッドを定義することにより、メソッドは一度だけ定義されます。

プロトタイプでメソッドを定義するもう 1 つの利点は、メソッドが静的になることです。静的メソッドはインスタンス オブジェクトを必要としません。たとえば、配列スライス メソッドは、配列インスタンスで呼び出すことができます[1,2,3].slice(1)。しかし、配列インスタンスがない場合でも、Array オブジェクトのプロトタイプからスライス メソッドにアクセスして呼び出すことができますArray.prototype.slice.call(arguments)

編集:静的メソッドはObject.method、必ずしもプロトタイプのプロパティではなく、より一般的に見られます。インスタンス メソッド.slice()が静的に呼び出されていたことを明確にする必要があります。

于 2013-04-03T20:57:28.043 に答える
1

new Person()プロトタイプの例でを作成するとsayHello()、人物オブジェクトと一緒にメモリに読み込まれません。

代わりに、必要になったり呼び出されたりするとすぐにオブジェクトに追加し、必要になったときに一度だけロードされます。

多くのオブジェクトを操作する場合、これによりユーザーのメモリを大幅に節約できます。

于 2013-04-03T20:43:03.667 に答える