CodeGym /コース /Frontend SELF JA /プロトタイプについて

プロトタイプについて

Frontend SELF JA
レベル 39 , レッスン 2
使用可能

3.1 プロトタイプの概念

プロトタイプはJavaScriptの重要な概念の一つで、オブジェクトが他のオブジェクトからプロパティやメソッドを継承することができる。多くの他のプログラミング言語では、継承はクラスを通じて行われているが、JavaScriptではプロトタイプに基づいている。プロトタイプとは何か、どのように動作するか、そしてどのように使用するかを見てみよう。

JavaScriptのプロトタイプは、他のオブジェクトがプロパティやメソッドを継承できるオブジェクトのことである。JavaScriptの各オブジェクトは、他のオブジェクトへの隠された参照、つまりそのプロトタイプを指し示す隠されたプロパティ[[Prototype]]を持っている。

このプロトタイプはさらに独自のプロトタイプを持つことができ、プロトタイプチェーン(prototype chain)を形成することで、オブジェクトのプロパティとメソッドはこのチェーンを通じて継承される。この仕組みは、オブジェクトが機能を共有し、オブジェクトの階層を作成するのに役立つ。

プロパティ proto

JavaScriptでは、各オブジェクトには__proto__プロパティがあり、これがそのプロトタイプを指し示す。このプロパティは、オブジェクト内に見つからないプロパティやメソッドを探すために使用される。

この例では、オブジェクトchildはオブジェクトparentからメソッドgreet()を継承している:

JavaScript
    
      const parent = {
        greet() {
          console.log('Hello from parent');
        }
      };

      const child = {
        __proto__: parent
      };

      child.greet(); // 出力: Hello from parent
    
  

3.2 プロトタイプの作成と使用

1. Object.create()

メソッドObject.create()は、指定されたプロトタイプを持つ新しいオブジェクトを作成する。

例:

JavaScript
    
      const parent = {
        greet() {
          console.log('Hello from parent');
        }
      };

      const child = Object.create(parent);
      child.greet(); // 出力: Hello from parent
    
  

2. プロトタイプへのプロパティとメソッドの追加

プロパティとメソッドをプロトタイプに追加して、それを継承するすべてのオブジェクトで使えるようにすることができる。

この例では、メソッドspeak()がプロトタイプanimalに追加され、オブジェクトdogで利用できる:

JavaScript
    
      const animal = {
        speak() {
          console.log(`${this.name} makes a noise.`);
        }
      };

      const dog = Object.create(animal);
      dog.name = 'Buddy';
      dog.speak(); // 出力: Buddy makes a noise.
    
  

3. オブジェクトのプロトタイプの変更

オブジェクトのプロトタイプはメソッドObject.setPrototypeOf()を使って変更できる。

この例では、オブジェクトduckのプロトタイプがanimalからbirdに変更される:

JavaScript
    
      const animal = {
        speak() {
          console.log('Animal speaks');
        }
      };

      const bird = {
        fly() {
          console.log('Bird flies');
        }
      };

      const duck = {
        __proto__: animal,
        quack() {
          console.log('Duck quacks');
        }
      };

      Object.setPrototypeOf(duck, bird);
      duck.fly();   // 出力: Bird flies
      duck.quack(); // 出力: Duck quacks
    
  

3.3 プロトタイプの操作

1. オブジェクトのプロトタイプの確認

メソッドObject.getPrototypeOf()を使用すると、オブジェクトのプロトタイプを取得できる。

例:

JavaScript
    
      const parent = {
        greet() {
          console.log('Hello from parent');
        }
      };

      const child = Object.create(parent);

      console.log(Object.getPrototypeOf(child) === parent); // 出力: true
    
  

2. オブジェクトがプロトタイプに属しているかの確認

演算子instanceofは、オブジェクトが特定のコンストラクタまたはプロトタイプのインスタンスであるかどうかを確認するために使用される。

例:

JavaScript
    
      function Person(name) {
        this.name = name;
      }

      const john = new Person('John');

      console.log(john instanceof Person); // 出力: true
    
  

3. オブジェクトとそのプロトタイプのプロパティの反復

オブジェクトとそのプロトタイプのプロパティを反復するには、for...inループを使用して、すべての列挙可能なプロパティを列挙できる。

例:

JavaScript
    
      const parent = {
        greet() {
          console.log('Hello from parent');
        }
      };

      const child = Object.create(parent);
      child.name = 'Child';

      for (let key in child) {
        console.log(key);
      }

      // 出力:
      // name
      // greet
    
  

オブジェクトの独自のプロパティのみを反復するには、メソッドObject.keys()for...ofループとObject.entries()メソッドを使用する。

例:

JavaScript
    
      const parent = {
        greet() {
          console.log('Hello from parent');
        }
      };

      const child = Object.create(parent);
      child.name = 'Child';

      console.log(Object.keys(child)); // 出力: ['name']

      for (const [key, value] of Object.entries(child)) {
        console.log(key, value);
      }

      // 出力:
      // name Child
    
  
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION