モダンjavascript入門]18


18ジェネレータとクラス構文


18.1ジェネレータ


18.1.1ジェネレータの定義方法

  • の新しい演算子を使用してオブジェクトを作成する(初期化によって構築される)
  • .
  • は、同じ名前の方法およびプロセスを有するオブジェクト
  • を効率的に作成することができる.
  • メソッドをコンストラクション関数のプロトタイプに追加すると、メモリの浪費を回避し、他のコンストラクション関数
  • に継承することができる.
  • 関数宣言として定義する方法
    (転送済み)
  • function Card(suit, rank) {
        this.suit = suit;
        this.rank = rank;
    }
    Card.prototype.show = function() {
        console.log(this.suit + this.rank)
    }
  • 関数文字として定義する方法
  • var Card = function(suit, rank) {
        this.suit = suit;
        this.rank = rank;
    }
  • クラス宣言として定義する方法
  • class Card {
        constructor(suit, rank) {
            this.suit = suit;
            this.rank = rank;
        }
    
        show() {
            console.log(this.suit + this.rank)
        }
    }
  • クラス式として定義する方法
  • var Card = class {
        constructor(suit, rank) {
            this.suit = suit;
            this.rank = rank;
        }
        show() {
            console.log(this.suit + this.rank)
        }
    }
    

    18.1.2作成者を使用してアクセス者プロファイルを定義する


    ユーザーに特定の方法でPropertyを読み書きさせることができます.(getter, setter)
    function Person(name) {
        Object.defineProtperty(this, 'name', {
            get : function() {
                return name;
            },
            set : function(newName) {
                name = newName;
            },
            configurable : true,
            enumerable : true,
        })
    }
    Person.prototype.sayName = function() {
        console.log(this.name);
    }
    
    var person = new Person('Tom');
    console.log(p.name); // Tom
    p.name = 'Huck';
    console.log(p.name); // Huck
    p.sayName(); // Huck

    18.2継承ジェネレータ


    18.2.1継承ジェネレータ


    JavaScriptでは、作成者がクラスの役割を果たします.
    オブジェクトのプロトタイプ継承メカニズムの使用
    作成者もオブジェクトであるため、オブジェクトのプロトタイプ継承を利用して作成者継承を実現することができます.
    継承された作成者:スーパータイプ作成者
    継承された作成者:サブタイプ作成者

    18.2.2スーパータイプジェネレータの例


    例1
    Ellipse作成者として作成されたインスタンス楕円は、
    Ellipse.プロトタイプとオブジェクト.プロトタイプから継承して使用可能

    18.2.3ジェネレータのプロトタイプを継承する

    function Circle(r) {
        this.a = r;
        this.b = r;
    }
    
    var circle = new Circle(2);
    circleのプロトタイプ:Circle.prototype
    Circle.プロトタイプのプロトタイプ:Object.prototype
    circleでEllipse.Prototypeを使用するには、Circleを使用します.原型はElipse.プロトタイプを継承する必要があります.
    ->Cycleの原型Ellipse.プロトタイプを挿入する必要があります
    例2

    例2-その他の方法
    でもこの方法はCircleです.欠点はプロトタイプで生成されたEllipseのPropertyを浪費することである.

    18.2.4借用構造関数


    Ellipse作成者定義のプロパティ(th.a,th.b)をcallメソッドを使用してCircle作成者にインポート

    18.2.5スーパータイプを使用する方法


    Ellipse.prototype.再定義ではなくtoStringを上書き
    Ellipse.prototypeメソッド定義の使用

    18.3 ECMAScript 6のクラス構文


    18.3.1クラス文法の基礎


    クラス構文のタイプ
  • クラス宣言
  • クラス式
  • // 생성자
    function Circle(center, radius) {
        this.center = center;
        this.radius = radius;
    }
    
    Circle.prototype.area = function() {
        return Math.PI * this.radius * this.radius;
    }
    
    // 클래스 구문
    class Circle2 {
        constructor(center, radius) {
            this.center = center;
            this.radius = radius;
        }
    
        // prototype 메서드
        area() {
            return Math.PI * this.radius * this.radius;
        }
    }
    クラス宣言の作成:
  • class 이름
  • クラスのボディ(クラスボディ){...}でクラスメンバーを定義します.
    クラスメンバーは関数宣言でfunction
  • を省略する.
  • コンストラクション関数に加えて、追加されたクラスメンバーは、メソッドによってプロトタイプに追加された
  • です.
    クラス宣言文と関数宣言文の違い
  • クラス宣言はエスケープされません.ジェネレータを使用する前に
  • を宣言する必要があります.
  • は1回しか記入できません.同じ名前のクラス宣言は、2回の作成時にタイプエラー
  • が発生しました.
  • クラス宣言で定義された作成者
  • のみを呼び出すことはできません.
    クラス式
    var Circle = class {
        //생성자를 이용한 초기화
        constructor(center, radius) {
            this.center = center;
            this.radius = radius;
        }
        area() {
            return Math.PI * this.radius * this.radius;
        }
    }
    classの後にすべての識別子を名前として使用できます
    var Circle = class Kreis { ... }
    
    // Kreis라는 이름은 클래스바디 내에서만 유효
    var k = new Kreis() // 에러발생
    var c = new Circle() // 정상적으로 인스턴스 생성됨

    18.3.2アクセス者の作成


    getterとsetterの作成
    class Person {
        constructor(name) {
            this.name = name;
        }
    
        get name() {
            return this._name;
        }
    
        set name(value) {
            this._name = value;
        }
    
        sayName() {
            console.log(this.name);
        }
    }
    getキーとsetキーを使用してアクセス者を定義する
    var person = new Person('Tom');
    console.log(person.name); // 'Tom'
    person.name = 'Huck';
    console.log(person.name); // 'Huck'
    person.sayName(); // Huck
  • name setter propertyに値を割り当てると、nameというpropertyが追加されます.
    この値をnameに
  • 格納
  • コンストラクション関数のパラメータname値をsetterのpersonに設定します.nameの
  • に代入
  • コンストラクション関数で受信したパラメータname、nameアクセス者property、nameは異なります.
  • getterもsetterもPersonです.プロトタイプで定義する
  • 18.3.3静的メソッドの作成


    静的メソッドを使用して静的メソッドを作成できます

    クラスを18.3.4に拡張して継承


    クラス宣言または式でextendsキーを使用して他のジェネレータを継承

    Ball作成者のインスタンスは、CircleのareaとtoStringのほかに、他の定義のmoveも使用できます.

    18.3.5スーパータイプメソッドの呼び出し


    スーパーキーを使用すると、サブタイプの作成者はスーパータイプの作成者のメソッドを呼び出すことができます.
    スーパータイプメソッドの使用
    **クラス構文定義関数(クラスを定義しない)