堅持的本身就是意義
目錄
- 直觀類比
- 類 (Class) vs 實例 (Instance)
- 對比表
- 示例代碼
- 類 - 原型 - 實例關系圖
- 解釋:
- 類 (class Person)
- 原型 (Person.prototype)
- 實例 (new Person(...))
- 總結:
直觀類比
- 類(Class) = 圖紙 / 模板
- 實例(Instance) = 根據圖紙造出來的房子 / 產品
類 (Class) vs 實例 (Instance)
對比表
對比點 | 類 (Class) | 實例 (Instance) |
---|---|---|
定義方式 | 使用 class 關鍵字定義 | 使用 new 類名(...) 創建 |
打印結果 | 打印出來的是 類的結構/定義 | 打印出來的是 對象(屬性 + 值) |
內存位置 | 存在于函數(構造器)區域 | 存在于堆內存,每次 new 都是新的對象 |
屬性 | 類本身沒有具體屬性值,只定義結構 | 實例對象上有具體的屬性和值 |
方法 | 方法定義在類的 prototype 上 | 實例可以直接調用這些方法 |
用途 | 相當于一個“模板” | 相當于由模板生產出來的“成品” |
例子代碼 | console.log(Person) 👉 輸出: class Person { constructor(...) {...} speak() {...} } | console.log(p1) 👉 輸出: Person { name: '張三', age: 22 } |
示例代碼
class Person {name: stringage: numberconstructor(name: string, age: number) {this.name = namethis.age = age}speak() {console.log(`我叫${this.name},今年${this.age}歲`)}
}console.log(Person) // 類的定義const p1 = new Person("張三", 22)
console.log(p1) // 實例對象 Person { name: '張三', age: 22 }
p1.speak() // 調用實例方法 我叫張三,今年22歲
類 - 原型 - 實例關系圖
┌─────────────────────────┐│ class Person ││ ─────────────────────── ││ constructor(name, age) ││ speak() { ... } │ ← 方法掛到 prototype 上└─────────────┬───────────┘│▼┌─────────────────┐│ Person.prototype│ ← 原型對象│ ─────────────── ││ speak() { ... } │ ← 共享方法│ constructor: f │└───────▲─────────┘│ [[Prototype]]┌────────────┴────────────┐│ │
┌──┴───────────┐ ┌──────┴───────────┐
│ p1 實例 │ │ p2 實例 │
│ ─────────── │ │ ─────────── │
│ name: '張三' │ │ name: '李四' │
│ age: 22 │ │ age: 18 │
└──────────────┘ └──────────────────┘
解釋:
類 (class Person)
- 定義了構造函數和方法。
- 方法其實會自動掛載到 Person.prototype 上。
原型 (Person.prototype)
- 所有實例共享的方法都存在這里。例如 speak() 方法,只存一份,所有實例都能通過原型鏈訪問。
實例 (new Person(…))
- 每次 new 都會創建一個新的對象(放在堆內存里),對象上存儲 獨有的數據屬性(name, age)。
- 調用 p1.speak() 時,JS 引擎會:
- 先找 p1 本身有沒有 speak
- 找不到 → 順著 proto(即原型鏈)去 Person.prototype 找
- 找到后執行
class Person {constructor(name, age) {this.name = namethis.age = age}speak() {console.log(`我叫${this.name},今年${this.age}歲`)}
}const p1 = new Person("張三", 22)console.log(p1) // Person { name: '張三', age: 22 }
console.log(Person.prototype) // { speak: f, constructor: f }
console.log(p1.__proto__ === Person.prototype) // true
總結:
- 類 (Class) 是模板,方法都放在 prototype 上。
- 實例 (Instance) 存放自己的數據屬性。
- 實例通過 proto 鏈接到 Person.prototype,形成原型鏈來共享方法。