Sean Vieira が説明したように、最初の方法は 2 番目の方法と同じではありません。最初のメソッドでは、インスタンスは から継承しPerson.prototype
ます。2 番目の方法では、インスタンスは から直接継承しますObject.prototype
。
方法 1:
null
^
|
| __proto__
|
+------------------+
| Object.prototype |
+------------------+
^
|
| __proto__
|
+------------------+
| Person.prototype |
+------------------+
^
|
| __proto__
|
+------------------+
| person |
+------------------+
方法 2:
null
^
|
| __proto__
|
+------------------+
| Object.prototype |
+------------------+
^
|
| __proto__
|
+------------------+
| person |
+------------------+
興味深いことに、上の図は、オブジェクトがコンストラクターからではなく、JavaScriptの他のオブジェクトから継承することを示しています。したがって、インスタンスを作成すると、それ自体ではなく からnew Person
継承されます。Person.prototype
Person
この関連情報はどうですか?手始めに、オブジェクトのインスタンスを作成するためにコンストラクターを作成する必要がないことを示しています。代わりに、次のようにプロトタイプ オブジェクトを直接作成します。
var person = {
create: function (name, gender) {
var person = Object.create(this);
person.gender = gender;
person.name = name;
return person;
},
speak: function () {
alert("My name is " + this.name + ".");
}
};
上記の例person
では、 と同等Person.prototype
です。person
次のように のインスタンスを作成できます。
var bob = person.create("Bob", "M");
のプロトタイプ チェーンは次のbob
ようになります。
null
^
|
| __proto__
|
+------------------+
| Object.prototype |
+------------------+
^
|
| __proto__
|
+------------------+
| person |
+------------------+
^
|
| __proto__
|
+------------------+
| bob |
+------------------+
では、なぜ代わりにこのようなオブジェクトを作成する必要があるのでしょうか?
- よりきれいに見えます。すべてが単一のオブジェクト リテラルにカプセル化されます。
- オブジェクトがオブジェクトから継承されることを理解するのは簡単です。コンストラクターは必要ありません。
new
インスタンスの作成に使用する必要はありません。これにより、多くの問題が解決されます。
このパターンの詳細については、「Why Prototypal Inheritance Matters」に関する私のブログ投稿を参照してください。