まず最初に、彼自身 (Crockford) をフィーチャーしたこのプレイリストをご覧になることをお勧めします。古いかもしれませんが、JavaScript の「ロジック」を非常によく説明しており、あなたの質問は特に 3 番目のビデオで回答されています。
質問の冒頭で投稿したクロックフォードのコメントもターゲットにしたいので、他の従来のオブジェクト指向プログラミング言語でオブジェクトがどのように描かれているかを説明することから、この質問への回答を開始します。
コンストラクターを理解するには、まずオブジェクトをよく理解する必要があります。従来の OOP 言語では、オブジェクトは、オブジェクトの状態を記述する変数 (プロパティまたはフィールドと呼ばれる) と、オブジェクトの動作を記述する関数 (メソッドと呼ばれる) のコレクションです。これらの (JavaScript 以外の) 言語では、これらのオブジェクトの「設計図」はクラスと呼ばれます。
したがって、Java で Human クラスを作成すると、非常に単純化して次のようになります。
class Human {
String name;
int weight; // kg
int height; // cm
void eat(int foodWeight) {
this.weight += foodWeight;
}
Human(int weight, int height, int name) {
this.weight = weight;
this.height = height;
this.name = name;
}
}
そして、上記の「設計図」を使用して、次のようにオブジェクトを作成します。
Human Joe = new Human(90, 180, "Joe");
そして今、体重が 90 kg で身長が 180 cmJoe
の のインスタンスであると言います。 Human
上記のクラスではHuman()
、オブジェクトを作成し、作成時の状態を定義するために使用される関数があることに気付きました。これは基本的にコンストラクターが行うことです。
では、JavaScript の違いは何でしょうか?
作成時に大衆にアピールするために (私が投稿したビデオ シリーズで聞くことができます)、JavaScript には Java に似た構文が組み込まれています。Crockford 氏によると、これによって実現したことは、プログラマーは Java をある程度知っている/学んでいるので、新しいコマンドをいくつか覚えてから JavaScript でプログラミングすることができるという考えをプログラマーに与えることです。 2つは類似点をはるかに上回ります。
JavaScript では、Java クラスのように見える方法でオブジェクトを作成するには、次のような関数構文を使用します。
var Human = function(name, height, weight) {
this.name = name;
this.height = height;
this.weight = weight;
this.eat = function(foodWeight) {
this.weight += foodWeight;
};
};
そして、Joe
上で行ったように定義したい場合は、次のようにします。
var Joe = new Human("Joe", 180, 90);
示されている Java 構文と JavaScript 構文の類似点を見ることができます。最初の質問に答えると、JavaScript コンストラクターは、 で呼び出されたときにnew
、 が指す暗黙的に作成されたオブジェクトを作成して返す関数ですthis
。
では、プロトタイプの出番はどこでしょうか? さて、JavaScript では、関数も JS オブジェクトそのものであり、 というプロパティがありますprototype
。したがって、Human()
上で作成したコンストラクタには というプロパティがあり、このプロパティは、 の他のすべてのインスタンスと同様に、prototype
プロパティとメソッドが によって継承されるオブジェクトを参照します。このオブジェクトは、継承されるプロパティを作成するために拡張できます。それらすべてのインスタンスによって。Joe
Human
たとえば、 のメソッドの 1 つにFunction.prototype
有名なtoString
メソッドがあります。あなたが定義することができます
Human.prototype.toString = function() {
return this.name + " is " + this.height + " cm tall and weighs " + this.weight + " kg";
}
次に、 を呼び出すJoe.toString()
かalert(Joe)
、自動的に を呼び出すようなことをするとtoString()
、返される値は「ジョーは身長 190 cm、体重 80 kg」になります。
あなたの質問の文脈でカバーできる OOP と JavaScript についての詳細は他にもたくさんありますが、私の答えは十分に長いと思います! これがあなたの質問に答えることを願っています。