導入
誰もがコンストラクターに精通していますが、あなたが初心者なら、コンストラクターが何であるかを理解する必要があります。コンストラクターは、特定のタイプのオブジェクトを作成するために使用されます - 使用されるオブジェクトを宣言するだけでなく、オブジェクトが初めて作成されたときにオブジェクトのメンバー値を設定するパラメーターも受け入れます。独自のコンストラクターをカスタマイズし、カスタムタイプオブジェクトのプロパティまたはメソッドを宣言できます。
基本的な使用法
JavaScriptでは、コンストラクターは通常、インスタンスを実装するために使用されると見なされます。 JavaScriptにはクラスの概念がありませんが、特別なコンストラクターがあります。新しいキーワードを使用して、定義された初期関数を呼び出します。 JavaScriptに、新しいオブジェクトを作成すること、および新しいオブジェクトのメンバー宣言がコンストラクターで定義されていることを伝えることができます。コンストラクターの内部では、このキーワードは新しく作成されたオブジェクトを指します。基本的な使用法は次のとおりです。
コードコピーは次のとおりです。
ファンクションカー(モデル、年、マイル){
this.model = model;
this.year = year;
this.miles = miles;
this.output = function(){
this.model + "left" + this.miles + "km"を返します。
};
}
var tom = new car( "Ancle"、2009、20000);
var dudu = new car( "dudu"、2010、5000);
console.log(tom.output());
console.log(dudu.output());
上記の例は非常に単純なコンストラクターパターンですが、少し問題です。まず第一に、継承を使用することは非常に厄介です。第二に、オブジェクトが作成されるたびに出力()が再定義されます。最良の方法は、CARタイプのすべてのインスタンスがこのoutput()メソッドを共有できるようにすることです。そうすれば、インスタンスの大きなバッチがある場合、多くのメモリを保存します。
この問題を解決するために、次の方法を使用できます。
コードコピーは次のとおりです。
ファンクションカー(モデル、年、マイル){
this.model = model;
this.year = year;
this.miles = miles;
this.output = formatcar;
}
function formatcar(){
this.model + "left" + this.miles + "km"を返します。
}
この方法は利用可能ですが、次のより良い方法があります。
コンストラクターとプロトタイプ
JavaScriptには、プロトタイプと呼ばれるプロトタイププロパティがあります。コンストラクターがオブジェクトを作成するために呼び出されると、コンストラクタープロトタイプのすべてのプロパティが新しく作成されたオブジェクトで使用できます。このようにして、複数の車のオブジェクトインスタンスは同じプロトタイプを共有できます。上記の例でコードを展開しましょう。
コードコピーは次のとおりです。
ファンクションカー(モデル、年、マイル){
this.model = model;
this.year = year;
this.miles = miles;
}
/*
注:ここでは、object.prototypeを使用しました。メソッド名、object.prototypeではなく
主にプロトタイプのプロトタイプオブジェクトの書き換えを避けるために使用されます
*/
car.prototype.output = function(){
this.model + "left" + this.miles + "km"を返します。
};
var tom = new car( "Ancle"、2009、20000);
var dudu = new car( "dudu"、2010、5000);
console.log(tom.output());
console.log(dudu.output());
ここでは、output()シングルインスタンスを共有して、すべての車のオブジェクトインスタンスで使用できます。
また、コンストラクターは、通常の機能を区別するために大文字から始めることをお勧めします。
新しいだけ使用できますか?
上記の例では、機能カーは新しいオブジェクトを作成する新しい使用を使用して作成されます。唯一の方法はありますか?実際、他の方法があります。2つをリストしましょう。
コードコピーは次のとおりです。
ファンクションカー(モデル、年、マイル){
this.model = model;
this.year = year;
this.miles = miles;
//出力出力をカスタマイズします
this.output = function(){
this.model + "left" + this.miles + "km"を返します。
}
}
//方法1:関数として呼び出されます
Car( "Ancle"、2009、20000); //ウィンドウオブジェクトに追加します
console.log(window.output());
//方法2:別のオブジェクトの範囲内で呼び出します
var o = new object();
car.call(o、 "dudu"、2010、5000);
console.log(o.output());
このコードの方法1は少し特別です。新規が関数を直接呼び出す場合、これはグローバルオブジェクトウィンドウを指します。確認しましょう:
コードコピーは次のとおりです。
//関数呼び出しとして
var tom = car( "uncle"、2009、20000);
console.log(typeof tom); // "未定義"
console.log(window.output()); //「叔父は20,000キロ歩いた」
この時点で、オブジェクトTomは未定義であり、window.output()は結果を正しく出力します。新しいキーワードを使用する場合、そのような問題はありません。検証は次のとおりです。
コードコピーは次のとおりです。
//新しいキーワードを使用します
var tom = new car( "Ancle"、2009、20000);
console.log(typeof tom); // "物体"
console.log(tom.output()); //「叔父は20,000キロ歩いた」
新しい強制
上記の例は、新品を使用しないという問題を示しています。それで、コンストラクターが新しいキーワードを強制する方法はありますか?答えはイエス、上記のコードです。
コードコピーは次のとおりです。
ファンクションカー(モデル、年、マイル){
if(!(このinstance of car)){
新しい車(モデル、年、マイル)を返します。
}
this.model = model;
this.year = year;
this.miles = miles;
this.output = function(){
this.model + "left" + this.miles + "km"を返します。
}
}
var tom = new car( "Ancle"、2009、20000);
var dudu = car( "dudu"、2010、5000);
console.log(typeof tom); // "物体"
console.log(tom.output()); //「叔父は20,000キロ歩いた」
console.log(typeof dudu); // "物体"
console.log(dudu.output()); //「duduは5000キロメートルを歩いた」
このインスタンスが車であるかどうかを判断することにより、新しい車を返却するか、コードを実行し続けることにします。新しいキーワードが使用されている場合、(このインスタンスの車)が真であり、次のパラメーターの割り当てが続きます。新しいものが使用されない場合、(この車のこのインスタンス)は虚偽であり、新しいインスタンスが再び返されます。
元のラッパー関数
JavaScriptには3つの元のラッパー関数があります。数字、文字列、ブール、両方が使用されることがあります。
コードコピーは次のとおりです。
//元のラッパー関数を使用します
var s = new String( "my string");
var n = new Number(101);
var b = new boolean(true);
//これをお勧めします
var s = "my string";
var n = 101;
var b = true;
推奨されますが、数値状態を保存する場合にのみ、これらのラッパー関数のみを使用します。違いについては、次のコードを参照できます。
コードコピーは次のとおりです。
//元の文字列
var greet = "こんにちは";
// split()メソッドを使用して分割します
Greet.split( '')[0]; // "こんにちは"
//元のタイプに新しい属性を追加してもエラーは報告されません
greet.smile = true;
//この値は取得できません(第18章ECMAScriptの実装で説明しました)
console.log(typeof greet.smile); // "未定義"
//元の文字列
var greet = new String( "Hello there");
// split()メソッドを使用して分割します
Greet.split( '')[0]; // "こんにちは"
//ラッパー関数タイプに新しい属性を追加してもエラーは報告されません
greet.smile = true;
//新しいプロパティに正常にアクセスできます
console.log(typeof greet.smile); //「ブール」
要約します
この章では、主に、コンストラクターモードの使用、呼び出し方法、および新しいキーワードの使用の違いについて説明します。私は誰もがそれを使用するときにそれに注意を払うことを願っています。
リファレンス:http://www.addyosmani.com/resources/ensentyjsdesignpatterns/book/#constructorpatternjavascript