4

私はMozillaDeveloperNetworkからオブジェクト指向JavaScriptの概要を読んでいました。node.jsの使用を開始する前に、非常に深刻なJavascriptを学ぶ時間です。

とにかく、継承のことは私にはとてもあいまいに思えます。ドキュメントからコピーして貼り付けます。

// define the Person Class
function Person() {}

Person.prototype.walk = function(){
  alert ('I am walking!');
};
Person.prototype.sayHello = function(){
  alert ('hello');
};

Studentこれは簡単ですが、継承によって事態は複雑になります。次の3つのステートメントが本質的に同じことをしていると他の誰かが思いますか?

// define the Student class
function Student() {
  // Call the parent constructor
  Person.call(this);
}

// inherit Person
Student.prototype = new Person();

// correct the constructor pointer because it points to Person
Student.prototype.constructor = Student;

JavaやPHPなどに非常に似ているため、最初のもの(親コンストラクターの呼び出し)を理解しています。しかし、それから問題が始まります。

なぜ電話する必要があるのStudent.prototype ですStudent.prototype.constructorか?

明確な説明が必要です。なぜこのコード:

// define the Student class
function Student() {
  // Call the parent constructor
  Person.call(this);
}

var student1 = new Student();

継承が機能するには十分ではありませんか?

編集:コンストラクターのことに関しては、すでにここで回答されています。

4

2 に答える 2

2

これは機能しません:

function Student() {
  Person.call(this);
}

var student1 = new Student();

PersonのプロトタイププロパティはStudentインスタンスでは使用できないためです。特定の値(つまりインスタンス)Person.call(this)で呼び出すだけです。しかし、関数は完全に空です-したがって、ここでは何もしません。との間には、役に立たない呼び出し以外の関係はありません。PersonthisStudentPersonStudentPersonPerson

Personの関数を取得するには、.prototype割り当てが必要です。

前:

<a Student instance>
  its prototype: Student.prototype, with all student functions
    its prototype: Object.prototype

後:

<a Student instance>
  its prototype: <a Person instance>, with all student functions if you add them
    its prototype: Person.prototype, with all person functions
      its prototype: Object.prototype
于 2012-08-31T14:58:44.973 に答える
1

Node.jsを使用している場合は、オブジェクト作成のためにECMAScript5メソッドを調べることをお勧めします。MDNには、良いガイドになるかもしれないページがありますJohnResigによる新しいメソッドの概要も参照してください。プロトタイプの継承は、Javaのような古典的なオブジェクト指向言語から来たときに頭を悩ますのは難しいです。幸運を!

于 2012-08-31T14:50:06.183 に答える