iT邦幫忙

0

【30 天JavaScript 實戰 】 Day 25 |原型、class 與 OOP (上)

2025-12-28 22:44:23304 瀏覽
  • 分享至 

  • xImage
  •  

JavaScript 其實不是 class 在撐世界
剛開始學 JavaScript 的時候,我一直以為它跟 Java、C# 很像
有 class、有 constructor、有 extends,看起來就很「物件導向」

直到某一天我發現——我根本搞錯它怎麼運作


一. 原來 class 只是「比較好看的寫法」

在 JavaScript 裡的這段,其實只是被包裝過的寫法

class Person {
  constructor(name) {
    this.name = name
  }

  sayHi() {
    console.log("Hi")
  }
}

JavaScript 真正執行的版本,比較像這樣

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

Person.prototype.sayHi = function () {
  console.log("Hi")
}

這時我才意識到一件事,
JavaScript 不是靠 class 運作而是靠 prototype
class 只是讓我們比較好寫、比較好讀,不是語言的核心。

二. 那 prototype 到底在幹嘛?

prototype 就像大家共用的工具櫃
每一個 Person 產生出來的物件都有自己的名字、資料
但「行為」其實可以共用,所以方法不需要每個人一份

三. 為什麼方法不該寫在實例上?

以前我常寫這樣

function Person(name) {
  this.name = name
  this.sayHi = function () {
    console.log("Hi")
  }
}

它可以跑,但問題是
每 new 一個人就重新建立一個 sayHi,這樣其實很浪費

比較合理的方式是:

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

Person.prototype.sayHi = function () {
  console.log("Hi")
}

這樣一來每個人有自己的資料
行為放在 prototype 共用

四. JS 找方法的方式,其實很老實

person.sayHi()

JavaScript 不是亂找,它的規則其實很單純~

  1. 先看自己有沒有
  2. 沒有 → 問原型
  3. 原型沒有 → 再往上問
  4. 問到沒人為止
    這條一路問上去的路,就是原型鏈

JavaScript 是原型導向
而class 是包裝,不是本體


/images/emoticon/emoticon24.gif


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言