TIL.63 Core J.S - 6. プロトタイプ


出版する
  • カーネルJavaScript-鄭在南
  • プロトタイプ


    オブジェクトをプロトタイプ(prototype)としてコピーし(参照)、継承されたような効果を得るタイプをプロトタイプと呼びます.

    1.プロトタイプの概念


    1.1 constructor, prototype, instance

  • 新しい演算子を使用してコンストラクション関数(Constructor)を呼び出し、
  • Constructorで定義した内容に基づいて新しいインスタンスを作成します.
  • では、インスタンスにprotoが自動的に付与され、
  • である.
  • 本番組はConstructor原型の番組を参照.
  • let instance = new Constructor()
  • let Person = function (name) {
      this._name = name;
    }; // 1.생성자 함수 (Constructor)
    
    Person.prototype.getName = function () {
      return this._name;
    }  
    
    let haiin = new Person('Haiin'); // 2.연산자 new 와 함께 haiin 이라는 인스턴스 생성
    
    console.log(haiin)
    // Person {
    //  _name: 'Haiin',
    //  __proto__: Person { constructor: ƒ Person(), getName: ƒ () }
    
    // 3.인스턴스에는 __proto__라는 프로퍼티가 자동으로 부여됨, Constructor 의 prototype 이라는 프로퍼티를 참조한다.
    
    haiin.__proto__.getName(); // undefined --(1)
      

  • getName()はthisです.nameなので、その指す場所を見るとhaiin.__proto__になります.propertyにはnameがないので、찾고자 하는 식별자가 정의돼 있지 않을 때는 Error 대신 undefined 를 반환한다というjavascript規約に従ってundefinedに戻ります.
  • __proto__は省略することができる.
  • 1.2コンストラクタ構成

  • コンストラクタのpropertyプロトタイプオブジェクトの内部およびインスタンスの__proto__オブジェクトの内部にコンストラクタというpropertyが存在し、コンストラクタ(自己)を参照する.
  • これは
  • 構造関数propertyからそのプロトタイプが何であるかを知る手段である.
  • コンストラクション関数は、読み取り専用プロパティを持つ例外(基本変数-number、string、boolean)に加えて、値を変更することもできます.
  • let Person = function (name) {
      this.name = name;
    };
    
    let p1 = new Person('사람1') //{name : '사람1'} true
    let p1Proto = Object.getPrototypeOf(p1)
    let p2 = new Person.prototype.constructor('사람2') //{name : '사람2'} true
    let p3 = new p1Proto.constructor('사람3') //{name : '사람3'} true
    let p4 = new p1.__proto__.constructor('사람4') //{name : '사람4'} true
    let p5 = new p1.constructor('사람5') //{name : '사람5'} true
    
    
    [p1, p2, p3, p4, p5].forEach(function (p) {
      console.log(p, p instanceof Person)
    })
    // 모두 동일한 대상을 가리킨다.

    2.プロトタイプチェーン


    2.1メソッドオーバーフロー


    インスタンスに同じ名前のプロパティまたはメソッドがある場合、呼び出されるメソッドは__proto__ではなく、メソッドです.
  • ソースを削除し、他のオブジェクトに置き換えるのではなく、メソッドの上にメソッドを上書きすることを示します.
  • let Person = function (name) {
      this.name = name;
    };
    
    Person.prototype.getName = function () {
      return this.name
    }
    
    let iu = new Person('지금')
    
    console.log(iu)
    
    iu.getName = function () {
      return '바로' + this.name
    }
    
    console.log(iu.getName()) // 바로 지금
    // 바로 위의 메서드를 호출, 만약 아래의 proto 가 생략이 되었다면 undefined 가 결과로 나와야 함
    console.log(iu.__proto__.getName()) // undefined

    2.2プロトコルタイプチェーン


    あるデータの__proto__プロトコル内部には、__proto__プロトコルがプロトタイプチェーン(prototype chain)と呼ばれ、そのチェーンに沿って検索されることをプロトタイプチェーン(prototype chaining)と呼ぶ.

    2.3対象専用メソッドの例外


    2.4マルチプロトコルチェーン