JavaScript 其實不是 class 在撐世界
剛開始學 JavaScript 的時候,我一直以為它跟 Java、C# 很像
有 class、有 constructor、有 extends,看起來就很「物件導向」
直到某一天我發現——我根本搞錯它怎麼運作
在 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 就像大家共用的工具櫃
每一個 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 共用
寫
person.sayHi()
JavaScript 不是亂找,它的規則其實很單純~
JavaScript 是原型導向
而class 是包裝,不是本體
![]()