在現代前端開發中,我們每天都在編寫 React.useState、Vue ref/reactive 或 Angular 的 @Component 類別。然而,當我們剝離 JSX、模板編譯器(Template Compiler)與 TypeScript 裝飾器(Decorators)這些外衣,前端框架的本質依然運行在 ECMAScript 的物件模型之上。
本文將從 JavaScript 最底層的 靜態方法(Static Methods)、實例方法(Instance Methods) 與 存取器屬性(Accessor Properties / Property Descriptors) 出發,縱向剖析這三項語言特性如何深刻影響了 Vue、Angular 與 React 的架構設計與 API 哲學。
在深入框架前,我們必須先釐細 JS 物件的三種關鍵行為:
class BaseModule {
// 1. 實例屬性與實例方法 (Instance Level)
constructor(name) {
this.name = name;
}
render() {
return `Rendering ${this.name}`;
}
// 2. 靜態方法 (Class/Constructor Level)
static create(name) {
return new BaseModule(name);
}
}
// 3. 存取器屬性 (Accessor Property Descriptor)
Object.defineProperty(BaseModule.prototype, 'status', {
get() {
return this._status;
},
set(value) {
this._status = value;
// 可以在此觸發 Side Effect(如派發更新)
},
enumerable: true,
configurable: true
});
prototype 或實例對象上,依賴 this 上下文與狀態(State)耦合。Property Descriptor 攔截屬性的讀寫操作,是實現「隱式響應式(Implicit Reactivity)」與「依賴追蹤」的核心機制。三大框架在設計時,對於這三種 JS 原生機制的採納偏好截然不同,這也決定了各自的心智模型(Mental Model):
Vue 的核心靈魂是 響應式系統(Reactivity System),其演進完美對應了 JS 存取器機制的發展:
data 物件,將所有屬性轉化為存取器屬性(get 負責依賴收集 depend(),set 負責派發更新 notify())。// Vue 響應式簡化示意 (Vue 2/3 的底層邏輯)
function reactive(obj) {
return new Proxy(obj, {
get(target, key, receiver) {
track(target, key); // 依賴收集
return Reflect.get(target, key, receiver);
},
set(target, key, value, receiver) {
const oldValue = target[key];
const result = Reflect.set(target, key, value, receiver);
if (oldValue !== value) {
trigger(target, key); // 觸發視圖更新
}
return result;
}
});
}
count.value++),背後由 Setter 悄悄完成視圖更新。Angular 深受傳統面向物件編程(OOP)影響,高度依賴 ES6 Class 的 實例方法 與 TypeScript 裝飾器(Decorators):
ngOnInit)即為實例方法。NgModule.forRoot() 這種靜態工廠方法模式)。@Component({ selector: 'app-demo', template: `...` })
export class DemoComponent implements OnInit {
private data: string;
constructor(private apiService: ApiService) {} // 依賴注入
// 實例方法:綁定元件生命週期與實例狀態
ngOnInit() {
this.data = this.apiService.getData();
}
}
this 作用域與實例方法來進行狀態維護。React 對於原生 Class 的態度經歷了重大轉變,並最終走向了 純函數與靜態導向:
React.Component,使用實例方法(如 render())與實例屬性(this.state)。this 與實例的概念。React.createElement、React.memo、React.lazy、React.forwardRef)本質上都是頂層的 靜態工具函數。// React 頂層靜態 API 哲學
const MemoizedComponent = React.memo(function MyComponent(props) {
// 純函數,每一次 Render 都是獨立的 Closure 狀態快照
return <div>{props.title}</div>;
});
React 拒絕使用 Object.defineProperty 或 Proxy 來做隱式攔截。它要求開發者顯式地調用 setState,並透過 不可變資料(Immutability) 與引用相等性檢查(Object.is)來驅動 Reconciliation(調和過程)。
| 框架 | JS 底層核心機制 | 狀態變更機制 | 心智模型 | 程式碼風格 |
|---|---|---|---|---|
| Vue.js | Accessor Properties (Proxy / Getter & Setter) | 隱式攔截與自動追蹤 (Reactive Mutation) | 響應式數據驅動 | 宣告式 / 數據導向 |
| Angular | Class ES6, Instance Methods & Decorators | 顯式狀態更新 / Zone.js 異步監聽 / Signals | 傳統 OOP 物件導向 | 類別與實例導向 |
| React | Pure Functions, Closure & Static Utilities | 顯式不可變更新 (setState, Immutability) |
函數式 UI 快照 | 函數式 (FP) |
理解了 JS 底層物件機制後,我們就能看清框架設計的本質取捨:
前端框架紛繁複雜,但萬變不離其宗。當你掌握了 JavaScript 的物件模型與底層機制,你就不再只是框架的使用者,而是能洞察設計者思維的 Web Platform 開發者。