JavaScript ES 6クラス実現原理詳細


JavaScript ES 6の前にはまだクラスの概念がなく、インスタンスオブジェクトを生成する従来の方法はコンストラクタを通して行われています。
たとえば:

function Mold(a,b){
         this.a=a;
         this.b=b;
     }
     Mold.prototype.count=function(){
       return this.a+this.b;
     };
     let sum=new Mold(1,2);
    console.log(sum.count())  //3
この中の書き方は伝統的な相手向けの言語とは大きく違っていて、書くのも比較的に煩雑です。
ES 6は他の言語にもっと近い書き方を提供し、クラスの概念を導入し、対象となるテンプレートは、クラスのキーワード、定義類(python、javaなど)を通じてできます。
もちろんES 6の大部分の機能はES 5で実現できます。ES 6のクラスはシンタックスキャンディーと見なされます。ただし、新しいクラス定義類の書き方は対象の原型の書き方をより簡単に明瞭にし、対象に向かうプログラミング思想により近いです。上のES 5に書かれたクラスとES 6を使用して実装されます。例えば、

class Mold{
       constructor(a,b){
         this.a=a;
         this.b=b;
       }
       count(){
         return this.a+this.b;
       }
    }
    let sum=new Mold(1,2);
    console.log(sum.count())  //3
ここでES 6のクラスは、クラスだけで定義され、クラスの方法はfunctionで定義される必要がない。ES 6のconstructor方法もあります。このような構造方法を表します。そして、そのthisキーワードはインスタンスオブジェクトを指しています。ここでES 5の構造関数Moldは、ES 6 Mold類のconstructor方法に相当します。
トラック
ES 6の例のオブジェクトの構造関数は、そのクラス自体です。そして、newクラス名がconstructorという関数を実行しました。
たとえば:

class Mold{
       constructor(){
        console.log("aaa")
       }
    }
 let m=new Mold();// aaa
 console.log(m.constructor===Mold);//true
上のコードのMold類のconstructorは、オブジェクトを実装する時にデフォルトのconstructorを実行します。
どのオブジェクトにも構造関数があり、構造関数は現在のオブジェクトのクラスと同じです。
たとえば:

let arr=new Array();
 console.log(arr.constructor===Array);//true
 let str=new String();
 console.log(str.constructor===String);//true
 let obj=new Object();
 console.log(obj.constructor===Object);//true
2.類の継承extens
親クラスを継承すると、子クラスは親タイプのすべての方法と属性を継承します。(静的方法と属性を含みます。)
サブクラスにconstructorの定義がない場合は、デフォルトでこの方法を追加します。
どんな種類にもconstructorの方法があります。
たとえば:

//class    extends      {}
Class Father{
   constructor(){
   }
   sum(){
     console.log("abc");
   }
   static fn(){
     console.log("hello")
   }
 }
 Class Son extends Father{
  
 }
 let s=new Son();
 s.sum()//abc,      sum()  
 Son.fn()//hello           fn()
継承後のサブメソッドの3つの処理:
1)完全継承は、この方法を書き換える必要がなく、子類の継承方法の内容は親と同じです。
2)上書きを書き換えるには、この種類の中でこの方法を書き換えるだけで継承された内容を上書きできます。
3)加工、サブクラスはsuperで親タイプの方法または属性を呼び出して加工し、さらにサブタイプの自分の方法と属性を加えることができます。
3.スーパー
親の構造関数を呼び出して直接super()を使用し、参照できます。
サブクラスのコンストラクタでは、superを呼び出してからthisキーを使用できます。そうでないとエラーが発生します。
たとえば:

//super.    ();
 class Father{
   constructor(){
    console.log("bbb");
   }
 }
 class Son extends Father{
   constructor(x){
    this.x=x;//ReferenceError,  
    super();
    this.x=x;//  
   }
 }
 let sum=new Son();//bbb
4.クラスのスタティック
属性または方法の前に、クラスの静的属性および方法を定義するためにstaticを使用する。
すべての静的属性と静的方法は、実用化されたオブジェクトを介して呼び出すことができません。
クラスによって呼び出す必要があります。静的属性と静的方法はクラスの排他的属性と方法であり、例示的なオブジェクトとは関係なく、配列および数学的方法のような:Aray.from();Math.random()
たとえば:

class Mold{
     static x=0;
     y=1;
     static fn1(){
       console.log("aaa")
     }
     fn2(){
       console.log("bbb");
     }
    }
   let m=new Mold();
   console.log(m.x,m.y);//undefined , 1
   m.fn1(); // TypeError 
   m.fn2(); // bbb
   //        
   Mold.fn1(); //aaa
   console.log(Mold.x);//0
静的な使用シーン:
一般的に静的な方法は、一連のタイプを解決するための方法である。
具体的なタイプを解決する方法は、特定の対象を解決する方法ではありません。
静的属性は、一般的にこのタイプの汎用的な属性変数の一連を記憶するために使用されます。
このような記憶は、クラスが作成された時にはすでに全体的になっています。どこでも呼び出され、自動的に破壊されません。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。