ray88’s diary

お仕事で困ったとき用の自分用の覚書

JavaScript インスタンスのメソッドの変更

JavaScript 目次 - ray88’s diary
・生成したインスタンスについてはメンバー変更可能。
 すなわちメソッド変更も可能。
・生成したインスタンスへのメソッドへ項は、インスタンス
 メソッドを直接的に変更するもので クラスのprototypeプロパティに
 変更を与えるものではない。
インスタンスとクラスのprototypeプロパティには同名のメソッドが
 それぞれ存在可能で バッティングした場合はインスタンス
 メソッドが優先して呼び出される。
【サンプルコード】
インスタンスpに対するgreetメソッドを上書きしても、
 Personクラスのprototypeプロパティ内のgreetメソッドは変更を受けていない

function myFunction(){
  //クラス「Person」を定義
  class Person{
    constructor(name,age){
      //thisキーワードを用いてnameプロパティ、ageプロパティを定義
      this.name = name;
      this.age = age;
    }
    //greetメソッドの定義
    greet(){
      console.log(`Hello! I am ${this.name}!`);
    }  
    //isAdultメソッドの定義
    isAdult(){
      return this.age >= 18;
    }  
  }
  //クラス「Person」のインスタンスを生成し、定数pに代入
  const p = new Person('Bob',25);
  //関数リテラルを代入し、インスタンスpのgreetメソッドを上書き
  p.greet = function(){
    console.log(`Good Bye I'm ${this.name}!`);
  }
  //greetメソッドを呼び出し
  p.greet();

  //Personクラスのprototypeプロパティ内のgreetメソッドの内容を出力
  console.log(Person.prototype.greet.toString());
  //インスタンスpのgreetメソッドの内容を出力
  console.log(p.greet.toString());
}