JS學習筆記#24 | 建構函數(Constructor Function)

koko-avatar-img
發佈於JS學習
更新於 發佈於 閱讀時間約 7 分鐘


一、簡介

建構函數是 JavaScript 中用來創建和初始化物件的一種特殊函數。

它像一個「模具」,透過 new 關鍵字生成多個相似的物件實例。

特點

  • 函數名稱通常首字母大寫(慣例,非強制)。
  • 使用 new 呼叫時,自動創建新物件並設定 thisnew 會在記憶體的堆中分配空間給新物件,每次創建的實例都獨立,佔用不同的記憶體位置。
  • 可以定義屬性和方法。


二、基本運作

1.定義建構函數

function Person(name, age) {
this.name = name; // 屬性
this.age = age;
this.sayHi = function() { // 方法
console.log(`Hi, I'm ${this.name}`);
};
}


2.使用 new 創建實例

const person1 = new Person("Alice", 25);
const person2 = new Person("Bob", 30);

console.log(person1.name); // "Alice"
person1.sayHi(); // "Hi, I'm Alice"
console.log(person2.age); // 30

new 做了什麼?

    • 創建一個空物件 {},並在記憶體中分配獨立空間。
    • this 綁定到這個新物件。
    • 執行建構函數內的程式碼,設置屬性和方法。
    • 自動返回這個新物件(除非手動返回其他東西)。


實例獨立性

每個用 new 創建的實例(例如 person1person2)是獨立的,佔用不同的記憶體位置,互不影響。可以用 person1 === person2 驗證,結果會為 false)。


三、建構函數的執行過程

function Car(model) {
this.model = model;
this.drive = function() {
console.log(`Driving a ${this.model}`);
};
}

const myCar = new Car("Toyota");
myCar.drive(); // "Driving a Toyota"

步驟

  • 1.new Car("Toyota")
    • 創建空物件 {},分配獨立記憶體空間。
    • this 指向這個物件。
  • 2.執行函數:
    • this.model = "Toyota"
    • this.drive = function...
  • 3.返回物件:
    • myCar 得到 { model: "Toyota", drive: function },獨立於其他實例。


四、建構函數與 class 的關係

ES6 引入 class,其實是建構函數的語法糖。

// 建構函數
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function() {
console.log(`Hi, I'm ${this.name}`);
};

// Class 寫法
class PersonClass {
constructor(name) {
this.name = name;
}
sayHi() {
console.log(`Hi, I'm ${this.name}`);
}
}

const p1 = new Person("Alice");
const p2 = new PersonClass("Bob");
p1.sayHi(); // "Hi, I'm Alice"
p2.sayHi(); // "Hi, I'm Bob"

差異

  • class 是更高階的抽象,內部仍基於原型。
  • class 更直觀,方法自動綁到原型。


五、注意事項

1.忘記 new

如果直接呼叫 Person("Alice")(不加 new),this 會指向全域物件(瀏覽器中是 window),造成錯誤。

function Person(name) {
this.name = name;
}
Person("Alice"); // 無 new
console.log(window.name); // "Alice"(全域污染)

解法:嚴格模式("use strict")會報錯,或檢查 this

//嚴格模式​
"use strict";
function Person(name) {
this.name = name;
}
Person("Alice"); // 報錯:Cannot set property 'name' of undefined
//檢查 this
function Person(name) {
if (!(this instanceof Person)) {
return new Person(name);
}
this.name = name;
}
const p = Person("Alice"); // 即使忘了 new 也沒問題
console.log(p.name); // "Alice"


2. 返回值的影響

正常情況下,new 會返回建構函數創建的物件(this)。但如果建構函數明確返回一個物件(而不是 undefined 或基本類型),new 會返回這個手動指定的物件,忽略 this。

function Test() {
this.name = "Test";
return { name: "Override" }; // 手動返回物件
}
const t = new Test();
console.log(t.name); // "Override"(而非 "Test")

//對比:
function Test2() {
this.name = "Test";
return "string"; // 返回基本類型
}

const t2 = new Test2();
console.log(t2.name); // "Test"(基本類型被忽略,new 使用 this)





留言
avatar-img
留言分享你的想法!
avatar-img
koko的沙龍
1會員
34內容數
koko的沙龍的其他內容
2025/03/11
在 JavaScript 中,函數是物件,因此它們有內建方法可以用來控制執行方式。 這些方法包括 .call()、.apply() 和 .bind(),主要用來改變函數執行時的 this 指向或傳遞參數,特別在物件導向或繼承中很有用。
Thumbnail
2025/03/11
在 JavaScript 中,函數是物件,因此它們有內建方法可以用來控制執行方式。 這些方法包括 .call()、.apply() 和 .bind(),主要用來改變函數執行時的 this 指向或傳遞參數,特別在物件導向或繼承中很有用。
Thumbnail
2025/03/09
每個建構函數都有 prototype 屬性,是一個物件,用來存放共享的方法或屬性。 物件透過 __proto__ 連接到其原型,形成屬性和方法的查找路徑。
Thumbnail
2025/03/09
每個建構函數都有 prototype 屬性,是一個物件,用來存放共享的方法或屬性。 物件透過 __proto__ 連接到其原型,形成屬性和方法的查找路徑。
Thumbnail
2025/03/01
遞迴是指一個函數自己呼叫自己,用來解決可以分解成相似小問題的大問題。它就像一層層深入,最後再一層層回來的過程。
Thumbnail
2025/03/01
遞迴是指一個函數自己呼叫自己,用來解決可以分解成相似小問題的大問題。它就像一層層深入,最後再一層層回來的過程。
Thumbnail
看更多
你可能也想看
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
本章節是Java入門的第八天,主要介紹物件導向的概念。這包括了類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、Lambda表達式、泛型和反射等主題。每個主題都配有相關的程式碼範例,以協助讀者更好地理解這些概念。
Thumbnail
本章節是Java入門的第八天,主要介紹物件導向的概念。這包括了類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、Lambda表達式、泛型和反射等主題。每個主題都配有相關的程式碼範例,以協助讀者更好地理解這些概念。
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
本章節是一個初級的 TypeScript 教學,主要介紹了 TypeScript 中物件導向程式設計的各種核心概念,包括類別、建構子、存取修飾子、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等。每個概念都通過詳細的解釋和實例代碼來進行深入的介紹。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本章節旨在介紹TypeScript中的函數,包括其基本結構、如何呼叫函數、函數的參數以及函數的返回值等相關概念。通過本章節,讀者可以學習到如何在TypeScript中使用不同的方式來定義函數,如函數聲明、函數表達式、箭頭函數和匿名函數等。
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
本章節旨在介紹TypeScript的基本語法,包括一般結構、程式進入點、註解以及變數的定義和賦值。這些知識將幫助讀者瞭解TypeScript的基本架構,並且可以開始使用TypeScript進行開發。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
Thumbnail
這些章節的目的是為了介紹JavaScript中的各種數據類型,包括基礎類型和物件類型,以及如何將數據從一種類型轉換為另一種類型。此外,還介紹了如何創建自定義類型,以及如何使用JavaScript中的陣列、集合和字典。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News