問題代碼
function ClassA() {
var value = 4; // 私有變量(閉包)
this.getValue = function() { return value; };
this.setValue = function(v) { this.value = v; }; // 此處 this.value 是原型/實例屬性
}
var a = new ClassA();
document.write(a.getValue()); // 4
a.setValue(1);
document.write(a.getValue()); // 4 (仍讀取閉包 value)
document.write(a.value); // 1 (訪問實例屬性 value)
輸出 441 的原因
getValue 始終返回閉包中的 value(初始值 4),setValue 卻在實例上創建了新屬性 this.value,並未修改閉包變量。
- 第三次輸出直接訪問實例屬性
a.value,得到 1。
正確修改私有變量的模式
function ClassA() {
var value = 4;
this.getValue = function() { return value; };
this.setValue = function(v) { value = v; }; // 直接修改閉包變量
}
// 或使用 ES6 Class + #私有字段(現代瀏覽器支持)
關鍵概念區分
| 概念 | 存儲位置 | 訪問方式 | 生命週期 |
| 閉包變量 (var value) | 函數執行上下文 | 內部函數引用 | 實例存在期間 |
| 實例屬性 (this.value) | 對象實例 | this. / obj. | 實例存在期間 |
| 原型屬性 (ClassA.prototype.value) | 原型對象 | 繼承鏈查找 | 所有實例共享 |