コンストラクタ


以下の内容は学院課程と「モダンjavascript Deep Dive:李雄莫沢」の読書と総括である.
1.コンストラクション関数によるオブジェクトの作成
オブジェクトを作成するときに、オブジェクトのテキストを使用する場合が最も多いです.しかし,この方法には致命的な欠点があり,一度に1つのオブジェクトしか生成しない.同じプロパティを持っていると仮定しますが、各プロパティの値には多くのオブジェクトが作成され、各オブジェクトに同じプロパティを追加する必要があります.複数のオブジェクトにpropertyを追加すると、メモリが浪費されるだけでなく、効率が低下し、エラーの可能性が高くなります.これらの欠点を解決するには、コンストラクション関数を使用してオブジェクト(インスタンス)を作成する方法があります.
コンストラクション関数によるオブジェクトの作成の利点
コンストラクション関数とは、テンプレートとして使用できる関数で、同じ形状(property構造が同じ)のオブジェクト(インスタンス)を作成します.例えば、Cookieボックス(コンストラクション関数)を使用すると、形状が同じ(Propertyキーが同じ)異なる味(Property値)のCookieを迅速に生成することができる.
コンストラクション関数の定義は通常の関数と同じであり、new演算子とともに呼び出されるとオブジェクトが生成されます.このようにして生成されるオブジェクトをインスタンスと呼ぶ.各インスタンスについて、異なるproperty値がコンストラクション関数のパラメータを介して渡される必要があります.コンストラクション関数でこの値を使用するには、this.프로퍼티키、例えばthisを使用する必要があります.thisは、関数の呼び出し方法に応じて変化し、コンストラクション関数呼び出しが使用される場合、コンストラクション関数が作成するインスタンスを示す.
重要なのは、コンストラクション関数として使用するために定義された関数を通常の関数として呼び出すこともできる.したがって、コンストラクション関数としてnew演算子とともに呼び出さなければならないことを覚えておいてください.
// 생성자 함수
function Cookie(flavor, size) {
    this.size = size;
    this.flavor = flavor;
    this.getWeight = function () {
    	return this.size * 1.5;
    }
}

// 인스턴스 생성
const chocolateCookie = new Cookie('chocolate', 5);
const vanillaCookie = new Cookie('vanilla', 3);
コンストラクション関数インスタンスの作成プロセス

  • インスタンスの作成とバインドthisコンストラクション関数は、実行時の前に空のオブジェクト(インスタンス)を作成し、コンストラクション関数の内部のthisにバインドされます.

  • インスタンスの初期化thisにバインドされ、インスタンスにpropertyとメソッドを追加し、パラメータによって渡された値をインスタンスのproperty値に割り当てて、固定値を初期化または割り当てます.

  • インスタンスを返す
    完了したインスタンスによってバインドされたthis(コンストラクション関数によって作成されたインスタンス)はデフォルトで返されます.
  • 注意点
    一般的な関数では、returnが記述されない場合、undefinedが返されるので、returnが記述されなければならない.ただし、コンストラクション関数では、returnは省略すべきである.コンストラクション関数の内部にreturnキーで元の値が作成された場合は無視され、オブジェクトが作成された場合は、コンストラクション関数で作成されたインスタンスではなくreturnキーで作成されたオブジェクトが返されます.ただし、コンストラクション関数はインスタンスを生成して返すため、returnを省略する必要があります.
    new.target
    JavaScriptでは、一般関数とコンストラクション関数は区別されません.コンストラクション関数を使用するために定義された関数であっても、通常の関数として呼び出すことができ、このようなエラーを防止するために、パスカルを例に通常の会議として記述することが望ましい.しかし、この方法は根本的に誤りを防ぐことはできない.
    ES 6は、このようなエラーを防止するためにnew.targetをサポートする.関数内部でnew.targetを使用すると、new演算子とともにコンストラクション関数が呼び出されたかどうかを確認できます.new演算子とともにコンストラクション関数として呼び出されると、関数内部のnew.targetは関数自体を指す.new演算子はなく、通常の関数として呼び出される関数内部のnew.targetundefinedである.ただし、new.targetはIEをサポートしていない.
    // 생성자 함수
    function Cookie(flavor, size) {
    
    	if (!new.target) {
        	return new Cookie(flavor, size);
        }
        
        this.size = size;
        this.flavor = flavor;
        this.getWeight = function () {
        	return this.size * 1.5;
        }
    }
    
    // 인스턴스 생성
    const chocolateCookie = new Cookie('chocolate', 5);
    const vanillaCookie = new Cookie('vanilla', 3);
    2.原型
    オブジェクト向けプログラミング
    人はある物事に対して認知を持っていて、区別する時、その特徴あるいは属性で区別します.例えば、二人が並んで立っていると、反対側の人は女で、眼鏡をかけていて、名前は金奎麗です.右側は男性で、眼鏡をかけていません.名前は洪吉童です.同じ方法で.この認知方式は,この認知方式をプログラミングに結びつけようとすることから,オブジェクト向けのプログラミング言語である.しかし,プログラム設計では,すべての特徴を用いるのではなく,必要な特徴のみを用いることで,必要な特徴のみを抽象化して表す.また,これらの必要な特性のみを収集し,それを資料構造にしたものを対象とする.
    このとき,簡略化された特性では,状態を表すものをproperty,対象内部から値を求める動作をメソッドと呼ぶ.オブジェクトを他のオブジェクトに関連付けることもできます.
    継承とプロトタイプ
    継承とは、あるオブジェクトが別のオブジェクトを継承するpropertyまたはメソッドを使用します.この場合、javascriptの継承はプロトコルタイプに基づいており、不要なコード重複を排除します.この場合,構造関数を再考する必要がある.コンストラクション関数はコードの繰り返し記述の作業量を減らすが,コンストラクション関数によって生成されるインスタンスには最終的に共通のコードがあるため,コードの再使用の観点から依然として欠点がある.
    では、これらの共通のコードを繰り返して繰り返し記述しないことができますか?プロトタイプ継承によって使用されます.一般的に、相続とは子供が親を継ぐものであり、原型もそう考えられる.プロトタイプは親キャラクタとしてのオブジェクトであり、子キャラクタとしてのオブジェクトは親キャラクタとしてのオブジェクトであり、自分のプロトタイプのようにプロトタイプのプロトタイプを自由に書き込むことができる.ただし、親ロールとして機能するオブジェクトでは、子ロールとして機能するオブジェクトのプロパティは使用できません.
    このようにpropertyを探して使用するときに検索するメカニズムをprototypeチェーンと呼び、このprototypeチェーンもscopeチェーンと同様に一方向チェーンテーブル形式を有する.
    // 생성자 함수
    function Cookie(flavor, size) {   
        this.size = size;
        this.flavor = flavor;
    }
    
    // 프로토타입
    Cookie.prototype.getWeight = function () {
    	return this.size * 1.5;
    }
    
    // 인스턴스 생성
    const chocolateCookie = new Cookie('chocolate', 5);
    const vanillaCookie = new Cookie('vanilla', 3);
    
    console.log(chocolateCookie.getWeight());
    
    3. this
    オブジェクトはプロシージャとメソッドで構成されます.この場合、メソッドは、そのオブジェクトが属するプロパティを参照および変更できます.そのため、私が属するオブジェクトがどこにあるかを知る必要があります.
    作成者関数は、Propertyまたはメソッドをインスタンスに追加するには、作成するインスタンスを参照する必要があります.ただし、インスタンスを作成するには、まずコンストラクション関数を定義する必要があります.ただし、コンストラクション関数を定義するときにインスタンスが作成されていないため、コンストラクション関数がインスタンスを直接指すことはできません.このため、thisという特殊な識別子が提供されます.
    このthisは、自分が属するオブジェクトまたは作成するインスタンスのプロシージャまたはメソッドを参照できる自己参照変数です.しかし、thisが指すオブジェクトは、関数を呼び出す方法によって異なる.(このバインドは動的に決定されます.)
    関数呼び出し方式thisが指すオブジェクト(thisにバインド)一般関数グローバルオブジェクトメソッドを呼び出すオブジェクトジェネレータ関数が作成するオブジェクト