首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaScript 面向對象陷阱:閉包變量與原型屬性的混淆

     編輯:程式設計綜合問答

問題代碼

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)原型對象繼承鏈查找所有實例共享
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved