第25章.カテゴリ



  • 類は原型の文法糖ですか?


    -->JavaScriptは、プロトタイプベースのオブジェクト向け言語です.
    -->プロトタイプベースのオブジェクト向け言語にはクラスは必要ありません.
    *ES 6に導入されたjavascriptのクラスは実際には関数であり、既存のプロトタイプベースのモードをクラスベースのモードとして使用することを可能にする構文糖である.

    クラスvsコンストラクション関数


    1)新しい演算子
    クラス:new演算子呼び出しなしエラー
    コンストラクション関数:new演算子呼び出しなしで通常関数として呼び出す
    2)キーワードの継承
    クラス:extends、スーパーキーを提供
    コンストラクタコンストラクタ:なし
    3)給油
    クラス:シースなしなどの動作
    コンストラクション関数:関数と変数の反発の具体的な値
    4) strict mode
    クラスクラスクラス:デフォルトで厳格なモードを指定します
    コンストラクタコンストラクタ:xの指定xノシテイx
    5)列挙
    クラス:リストされません.
    ジェネレータ関数:リストされます.
    -->クラスは新しいオブジェクト生成メカニズムです!!

  • クラス定義


    クラス宣言

    class Person {};
    //익명 클래스 표현식
    const Person = class {};
    //기명 클래스 표현식
    const Person = class MyClass {};
    -->クラスは式で定義できます==>クラスは1レベルのオブジェクトです.

    クラスボディで定義できるメソッド


    1)コンストラクション関数(コンストラクション関数)
    2)プロトタイプ方法
    3)静的方法
    // 클래스 선언문
    class Person {
       // constructor
       constructor(name) {
           this.name = name; // name 프로퍼티는 public
       }
       // 프로토타입 메서드
       sayHi() {
           console.log(`Hi! My name is ${this.name}`);
       }
       // 정적 메서드
       static sayHello() {
           console.log('Hello!');
       }
    }
    // 인스턴스 생성
    const me = new Person('Lee');
    // 인스턴스의 프로퍼티 참조
    console.log(me.name) // Lee
    // 프로토타입 메서드 호출
    me.sayHi();
    // 정적 메서드 호출
    Person.sayHello();

    関数定義方式:クラスvs構築関数


    1)作成者
    クラス:constructor()
    コンストラクション関数:function関数名()
    2)プロトタイプ方法
    クラスクラス:関数名()
    コンストラクション関数:コンストラクション関数名.prototype.関数名
    3)静的方法
    クラスクラス:静的関数名()
    コンストラクション関数:コンストラクション関数名.関数名

  • クラス反発


    -->クラスは、実行前に関数として評価され、関数オブジェクトを作成します.
    クラスはクラス定義の前に参照できません.
    -->クラス宣言もエスケープを生成しますが、エスケープの方法はletとconstキーワード宣言の変数と同じです.=>>一時の死角地帯に陥る.

  • インスタンスの作成


    クラス=>コンストラクション関数とnew演算子を呼び出してインスタンスを作成
    class Person {}
    // 인스턴스 생성
    const me = new Person();
    console.log(me); // Person {}
    -->クラスがnew演算子とともに呼び出されていない場合、エラーが発生します.
    *記名関数式と同様に、クラス式で使用されるクラス名は外部コードからアクセスできません==>識別子名.

  • 方法


    1.コンストラクション関数(コンストラクション関数)


    -->インスタンスの作成と初期化に使用する特別なメソッドの名前を変更できません->
    class Person {
       // 생성자
       constructor(name) {
           // 인스턴스 생성 및 초기화
           this.name = name;
       }
    }
    -->constructor内部のthisはクラス生成のインスタンスを指します.

    コンストラクション関数vsコンストラクション関数


    1)コンストラクション関数はクラスに最大1つしか存在しません!!
    -->スキップ時に空のコンストラクタを暗黙的に定義
     コンストラクション関数にパラメータを宣言すると、クラスの外部からインスタンスプロセスの初期値を渡すことができます.
    class Person {
       constructor(name, address) {
           // 인수로 인스턴스 초기화
           this.name = name;
           this.address = address;
       }
    }
    // 인수로 초기값 전달 --> constructor로
    const me = new Person('Lee', 'Seoul') // Lee, Seoul이 consturctor로 전달
    -->コンストラクション関数戻り文の省略->予期せぬリターンが発生しました

    2.プロトタイプ方法


    コンストラクション関数:prototypeにメソッドを明示的に追加する
    クラスクラス:内部定義のメソッドはデフォルトでプロトタイプメソッドとして動作します.
    クラスもプロトタイプチェーンを生成!!

    3.静的方法


    -->インスタンスを作成せずに呼び出す方法
    コンストラクション関数:コンストラクション関数名のメソッドで呼び出されます.
    ≪クラス|Class|ldap≫:静的キーの使用
    静的メソッドは、プロトタイプではなくクラスにバインドするメソッドです!
    また、静的メソッドではインスタンスを呼び出すことができません!!-->チェーンにxが存在する

    4.静的方法vsプロトタイプ方法


    1)両者が属するプロトタイプチェーンが異なる.
    2)スタティックメソッド呼び出しクラス,プロトタイプメソッド呼び出しインスタンス.
    3)静的メソッドはインスタンスプロシージャを参照できないが,プロトタイプメソッドは
    1番です.静的メソッド-->インスタンスプロシージャ参照x
    class Square {
       static area(width, height) {
           return width * height;
       }
    }
    console.log(Square.area(10, 10)); // 100
    2日です.プロトタイプメソッド-->インスタンスプロトタイプを参照してください
    class Square {
       constructor(width, height) {
           this.width = width;
           this.height = height;
       }
       area() {
           return this.width * this.height;
       }
    }
    const square = new Square(10, 10);
    console.log(square.area()); // 100

    5.クラスで定義されたメソッドの特徴


    1)functionキーワード省略の方法でサムネイル表示
    2)対象文字とは異なり、カンマxを使用
    3)厳格モードデフォルト運転
    4)リストできません
    5)内部メソッドでnon-constructor-->new演算子を呼び出すことはできません

  • クラスのインスタンス作成プロセス


    1.インスタンスを作成してバインドする


    クラスの呼び出し時に空のオブジェクトを暗黙的に作成する->空のオブジェクトをここにバインドする

    2.インスタンスの初期化


    constructorの内部コードの実行->これにバインドされたインスタンスの初期化

    3.インスタンスを返す


    デフォルトはバインドされたthisを返します

    プロセス

    class Person {
       // 생성자
       constructor(name) {
           // 1. 암묵적으로 인스턴스 생성, this에 바인딩
           console.log(this); // Person {}
           // 2. this에 바인딩되어 있는 인스턴스 초기화
           this.name = name;
           // 3. 완성된 인스턴스가 바인딩된 this가 암묵적으로 반환
       }
    }

  • 保証する


    1.インスタンスの割合


    -->コンストラクション関数でのインスタンス構成の定義
    class Person {
       constructor(name) {
           // 인스턴스 프로퍼티
           this.name = name;
       }
    }
    const me = new Person('Lee');
    console.log(me); // Person {name: 'Lee'}
    -->constructor内でこのアイテムに追加されたPropertyは、常にクラスが作成したインスタンスのPropertyです.

    2.訪問者の割合


    -->独自の値を必要とせずに、別のデータ・プロシージャの値を読み取りまたは格納するためのアクセス者関数からなるプログラム.
    class Person {
       constructor(firstName, lastName) {
           this.firstName = firstName;
           this.lastName = lastName;
       }
       // 접근자 프로퍼티
       get fullName() {
           return `${this.firstName} ${this.lastName}`;
       }
       // 접근자 프로퍼티 setter 함수
       set fullName(name) {
           [this.firstName, this.lastName] = name.split(' ');
       }
    }
    const me = new Person('Ungmo', 'Lee');
    *getterとsetterの名前はインスタンスpropertyとして使用されます.(参照)
    1)getterは取得に使用され、いくつかの内容を返さなければならない.
    2)setterは、特定のコンテンツを割り当てるために使用されるため、1つのパラメータ(1つのみ)が必要です.
    -->訪問者PropertyもインスタンスPropertyではなくプロトタイプPropertyです.

    3.推奨定義クラスフィールド


    クラスフィールド:クラスが作成するインスタンスの構成
    *JavaScriptのクラスマスターでは、メソッドのみ宣言できます.
    JavaScriptでは、クラスベースのオブジェクト向け言語のようにクラス本体内でインスタンスプロシージャを宣言することもできます.(ただし、これにバインドすることはできません.)
    -->これはコンストラクション関数とメソッドの内部でのみ有効です.

    4.プライベートフィールドの定義を推奨


    JavaScriptはパッケージを完全にサポートしていません.
    -->いつでも公衆です.(推奨コンストラクション関数とクラスフィールド定義)
    新しいprivate機能の推奨-->#.
    class Person {
       // private 필드 정의
       #name = '';
       constructor(name) {
           //private 필드 참조
           this.#name = name;
       }
    }

    public vs private


    public:どこにでもある
    private:クラスのみ参照
    -->プライベートフィールドには、クラス外部からのみ間接的にアクセスできます.
    -->アクセス者propertyでgetできます!!
    privateフィールドは、コンストラクション関数ではなくクラスボディで定義されています!!

    5.静的フィールドの定義を推奨


    推奨static public、static privateフィールドの定義
    class MyMath {
       // static public 필드
       static PI = 22 / 7;
       // static private 필드
       static #num = 10;
       // static 메서드
       static increment() {
           return ++Mymath.#num;
       }
    }

  • 拡張クラスを継承する


    1.継承クラスと継承コンストラクタ


    プロトタイプベースの継承と継承ベースのクラス拡張は異なります.
    -->継承拡張クラス既存のクラスを継承して新しいクラスを拡張
    -->継承クラスの属性+拡張属性(コードの再利用)
    class Animal {
       constructor(age, weight) {
           this.age = age;
           this.weight = weight;
       }
       eat() { return 'eat'; } // 프로토타입 메서드 eat
       move() { return 'move'; } // 프로토타입 메서드 move
    }
    // 상속을 통해 Animal 클래스를 확장한 Bird 클래스
    class Bird extends Animal {
       fly() { return 'fly'; }
    }
    const bird = new Bird(1,5);
    -->extendsキーワードは継承可能

    2.extendsキーワード

    // 수퍼 클래스
    class Base {}
    // 서브 클래스
    class Derived extends Base {}
    -->スーパー、サブクラス生成インスタンス、クラスプロトコルタイプチェーン.
    -->プロトタイプメソッドと静的メソッドの両方を継承できます.

    3.動的継承


    -->extendsキーワードはクラスとコンストラクション関数を継承してクラスを拡張できます
    // 생성자 함수
    function Base(a) {
       this.a = a;
    }
    // 생성자 함수를 상속받는 클래스
    class Derived extends Base {}
    const derived = new Derived(1);
    console.log(derived); // Derived {a : 1}
    -->extendsキーワードは、関数オブジェクトとして評価できる任意の式を継承します->ダイナミック継承

    4.サブクラスの構築関数


    -->親と子のコンストラクション関数を無視すると、空のオブジェクトが作成されます.
    -->コンストラクション関数にインスタンスプロセスを追加

    5.スーパーキー


    -->呼び出しと参照に使用できる特別なキーワード
    1)呼び出し:スーパークラスのコンストラクタを呼び出す
    2)参照:スーパークラスを呼び出す方法

    1.コール


    スーパークラスでconstructorが省略され、サブクラスでconstructorが省略されている場合、デフォルトではスーパークラスのconstructorが作成されます.
    // 수퍼클래스
    class Base {
       constructor(a,b) {
           this.a = a;
           this.b = b;
       }
    }
    // 서브클래스
    class Derived extends Base {
       constructor(a,b,c) {
           super(a,b);
           this.c = c;
       }
    }
    const derived = new Derived(1,2,3);
    console.log(derived); // Derived {a:1, b:2, c:3}
    *スーパーコールの注意事項
    1)サブクラスでコンストラクション関数を省略しない場合はsuperを呼び出す必要があります
    2)この参照は、サブクラスのコンストラクション関数からスーパーコールを呼び出すまで使用できません.
    3)superはサブクラスのコンストラクション関数からしか呼び出せない

    2.参照


    -->スーパークラスを呼び出す方法
    // 수퍼클래스
    class Base {
       constructor(name) {
           this.name = name;
       }
       sayHi() {
           return `Hi! ${this.name}`;
       }
    }
    // 서브클래스
    class Derived extends Base {
       sayHi() {
           return `${super.sayHi()}. how are you doing?`;
       }
    }
    const derived = new Derived('Lee');
    console.log(derived.sayHi()); // Hi! Lee. how are you doing?

    6.継承クラスインスタンスの作成プロセス

    // 수퍼클래스
    class Rectangle {
       constructor(width, height) {
           this.width = width;
           this.height = height;
       }
       getArea() {
           return this.width * this.height;
       }
       toString() {
           return `width = ${this.width}, height = ${this.height}`;
       }
    }
    // 서브클래스
    class ColorRectangle extends Rectangle {
       constructor(width, height, color) {
           super(width, height)
           this.color = color;
       }
       // 메서드 오버라이딩
       toString() {
           return super.toString() + `, color = ${this.color}`;
       }
    }

    1.サブクラスのスーパーコール


    サブクラスはインスタンスを直接作成するのではなく、スーパークラスにインスタンスの作成を委任します-->サブクラスはスーパーコールを行う必要があります
    -->サブクラスコンストラクション関数にsuperがない場合、インスタンスを作成できないためエラー

    2.スーパークラスインスタンスを作成し、そのインスタンスをバインドする


    スーパークラスとは、空のオブジェクト作成->スーパークラスコンストラクション関数の内部に作成されたインスタンスです.
    !! サブクラスのインスタンスはサブクラスによって作成されたとみなされます!!
    -->作成したインスタンスのプロトタイプは、サブクラスのプロトタイプが指すオブジェクトです.

    3.スーパークラスインスタンスの初期化


    -->スーパークラスのコンストラクション関数を実行し、このようなインスタンスにバインドされたインスタンスを初期化します.

    4.サブクラス構築関数を返してバインド


    -->サブクラスは個々のインスタンスxを作成し、superが返すインスタンスはここにバインドされ、

    5.初期化サブクラスの例


    6.インスタンスを返す


    7.拡張標準ビルダー関数


    -->extendsキーワードは、クラスだけでなく[Construct]内部メソッドを持つ関数オブジェクトとして評価できるすべての式で使用できます.