ジェネレータによる継承



-親コンストラクション関数funcionとしてPersonオブジェクトとそのPersonプロトタイプオブジェクトが存在し、それらは互いに参照される.
-同様に、constructor funcion PersonPlusオブジェクトと独自のプロトタイプオブジェクトが相互参照されます.

-PersonPlusオブジェクトに基づいて、new演算子を使用してkimという名前のオブジェクトを作成します.
-kimオブジェクトのprotoという名前のpropertyは、そのコンストラクション関数を作成するprototype propertyが指すオブジェクト、すなわちPersonPlusのprototypeオブジェクトを指します.
この状態でkim.avg()を呼び出すと、kimオブジェクトのavg propertyがない場合は、protoに沿ってPersonPlusのプロトタイプオブジェクトにavgがあるかどうかを確認して実行できます.
-kim.sum()を呼び出すと、kimオブジェクトにもPersonPlusのプロトタイプオブジェクトにもないため、エラーが発生します.

-Personというconstructor funcionにprototypeオブジェクトのsumというメソッドを呼び出すようにしたい.
-PersonPlusのPrototypeオブジェクトで、proto propertyはPersonのPrototypeオブジェクトを指します.
  • コンストラクション関数propertyの役割は、どのオブジェクトが誰から作成されたかを通知することです。

    -new演算子で、コンストラクション関数が何なのか分からなくても、新しいオブジェクトを作成できます.
  • -ジェネレータによって継承されたものとの比較
    <script>
    function Person(name, first, second){
      this.name = name;
      this.first = first;
      this.second = second;
    }
    Person.prototype.sum = function(){
    // person을 이용하여 만들어진 모든 객체에서 공유하는 sum메소드 생성
      return this.first+this.second;
    }
    //Person, constructor function 상속한 생성자
    function PersonPlus(name, first, second, third) {
      Person.call(this, first, second)
    //Person함수의 call메소드를 실행하여 PersonPlus 생성자가 new를 통해 만들어지는 객체인 this를 첫 번째 인자로 넣어준다.
    this.third = third;
    }
    PersonPlus.prototype = Object.create(Person.prototype)
    //Person.prototype객체를 __proto__로 하는 새로운 객체가 만들어진다. 
    //새로운 객체는 __proto__가 Person을 가르키게 된다.
    //그러나 새로운 객체로 PersonPlus.prototype을 대체해버린다. 
    //그렇기에 Person.prototype.constructor를PersonPlus로 대입해줘야한다.
    Person.prototype.constructor = PersonPlus;
    //PersonPlus.prototype.__proto__ = Person.prototype; 이 방식은 __proto__만 바꾸는 것이다.__proto__는 비표준이기에 사용하질 않는다.
    PersonPlus.prototype.avg = function(){
      return (this.first+this.second+this.third)/3;
    }
    const k = new PersonPlus('kim',10, 20, 30);
    console.log('k.sum()', k.sum());
    console.log('k.avg()', k.avg());
    </script>
    -classによって継承されたものとの比較
    <script>
    class Person{
    //function Person(name, first, second)과 같다.
      constructor(name, first, second){
        this.name = name;
        this.first = first;
        this.second = second;
      }
      sum() {
        return this.first+this.second+this.third;
      //Person.prototype.sum = function(){return this.first+this.second;}과 같은 맥락
      }
    }
    class PersonPlus extends Person{
      constructor(name, first, second, third){
        super(name, first, second, third);
      //Person.call(this, first, second)과 같은 맥락
        this.third = third;
      }
      sum() {
        return super.sum()+this.third;
      }
      avg() {
        return (this.first+this.second+this.third)/3;
      }
    }
    const k = new PersonPlus('kim',10, 20, 30);
    console.log('k.sum()', k.sum());
    console.log('k.avg()', k.avg());
    </script>

    n/a.結論


    ユーティリティは、コンストラクション関数ではなくクラス継承を使用しますが、prototypeとprotoの関係を理解する必要があります.