[JS-Flow]プロトタイプ



この文章はCore JavaScript特別講座の内容をまとめた.

整理する


ES 6以前はJavaScriptにクラスの概念はありませんでした.しかしjavascriptがオブジェクト向けの言語を使用できるのはprototypeがあるからです.
JAvascriptは正確にはプロトコルタイプに基づく言語です.
クラスがないので、機能を継承することはほとんどありません.だから原型をベースに、継承を真似て使います.
ちなみに、ES 6からClass構文が追加されていますが、JavaScriptがクラスベースに変更されるのではなく、構文が追加されています.

  • JavaScriptのすべての(すべてのタイプ)がオブジェクト(Object)を継承します.(原型で継承?)だからすべて客体です.あるいは客体のように使えます.

  • すべてのオブジェクトにプロトタイプ属性オブジェクトがあります.

  • ジェネレータのprototypeでオブジェクトを作成すると、すべてのインスタンスが共同で使用できます.

  • プロトタイプは、インスタンスで一般的なメソッドと変数を定義します.

  • +JavaScriptのタイプは、コンストラクション関数によって定義されます.x Array Number等
  • プロトタイプ



  • コンストラクション関数には、「プロトタイプ」という名前のオブジェクトがあります.

  • newキーワードとコンストラクション関数(Constructor)を使用してインスタンスを作成します.

  • インスタンスはまた、__proto__というオブジェクトを生成し、__proto__は構造関数のプロトタイプを参照します.

  • このとき__proto__は省略可能であり、直接インスタンスとしてコンストラクタのプロトタイプを参照する.
  • 以下の4種類はいずれも原型を指す.
    CONSTRUCTOR.prototype
    INSTANCE.__proto__
    INSTANCE
    Object.getPrototypeOf(INSTANCE)
    プロトタイプアクセスジェネレータも使用できます.
    CONSTRUCTOR
    CONSTRUCTOR.prototype.constructor
    INSTANCE.__proto__.constructor
    INSTANCE.constructor
    (Object.getPrototypeOf(INSTANCE)).constructor
  • INSTANCE.변수を使用する場合、まず構造関数に対応する変数があるかどうかを検索します.

  • ない場合は、ジェネレータのプロトタイプで変数を検索して使用します.

  • コンストラクション関数とプロトタイプで同じ変数がそれぞれ宣言されている場合.
  • INSTANCE.변수INSTANCE.__proto__.변수は価格が違います.
  • INSTANCE.변수は、コンストラクション関数で定義された変数を優先的に使用します.
  • プロトタイプフィルタ



    どのタイプの作成者にもプロトタイプが存在し、プロトタイプはオブジェクトです.
    したがって、プロトタイプは再びオブジェクトのインスタンスであり、オブジェクトのプロトタイプと一致します.(__proto__は省略可能)
    したがって、オブジェクトのプロトタイプで定義されたメソッドを使用することができます.
    オブジェクトのプロトタイプでオブジェクトでのみ使用する方法を定義すると、使用しない他のタイプが発生するため、オブジェクト作成者はオブジェクトでのみ使用できる関数を定義します.したがって,オブジェクト作成者定義から見ると定義は複雑である.
    var arr = [1, 2, 3];
    arr.toString = function() {
        return this.join('_');
    }
    
    console.log(arr.toString()); // "1_2_3", 생서자의 정의에 의해
    console.log(arr._proto_.toString()); // "1, 2, 3", 프로토타입의 정의에 의해
    console.log(arr._proto_._proto_.toString()); //[object Array], 객체의 정의에 의해