認識原型

Frontend SELF TW
等級 39 , 課堂 2
開放

3.1 原型概念

原型是 JavaScript 中的一個關鍵概念,允許物件從其他物件繼承屬性和方法。與許多其他程式語言中透過 class 實現的繼承不同, 在 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 用於檢查物件是否為特定 constructor 或原型的實例。

範例:

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