// 方式一:構造函數上直接掛載
function Aaa() {}
Aaa.a = 111;
// 方式二:原型鏈掛載
function Bbb() {}
Bbb.prototype.b = 111;
| 維度 | 構造函數屬性 (Aaa.a) | 原型屬性 (Bbb.prototype.b) |
|---|---|---|
| 屬性存儲位置 | 函數對象自身 | 函數的 prototype 對象 |
實例訪問 (new Aaa()) | 不可訪問:實例無 a 屬性,原型鏈上也無 | 可訪問:實例通過原型鏈繼承 b |
| 構造函數直接訪問 | Aaa.a ✓ | Bbb.b ✗(需 Bbb.prototype.b) |
| 內存佔用(大量實例) | 每實例無額外開銷(但屬性非共享) | 所有實例共享同一屬性,節省內存 |
| 修改影響範圍 | 修改 Aaa.a 不影響已創建實例 | 修改 Bbb.prototype.b 即時影響所有實例(含已創建) |
function Aaa() {}
Aaa.a = 111;
function Bbb() {}
Bbb.prototype.b = 111;
const objA = new Aaa();
const objB = new Bbb();
console.log(objA.a); // undefined ❌
console.log(Aaa.a); // 111 ✓
console.log(objB.b); // 111 ✓
console.log(Bbb.b); // undefined ❌
console.log(Bbb.prototype.b); // 111 ✓
Array.isArray、Math.PI,通過類名調用,無需實例化。class Bbb {
constructor() {
this.instanceProp = 100; // 私有實例屬性
}
static staticProp = 200; // 對應構造函數屬性 Bbb.staticProp
get protoProp() { return 300; } // 對應原型訪問器/方法
}
理解「構造函數是函數對象,prototype 是普通對象,實例通過 __proto__ 指向 prototype」這一原型鏈核心圖景,即可靈活掌握屬性掛載策略。