function Pager($ele, options) {
this.$ele = $ele;
this.options = options = $.extend(defaults, options || {});
this.init();
}
核心行:this.options = options = $.extend(defaults, options || {});
JavaScript 中賦值運算符 `=` 是**右結合**,且賦值表達式**本身有值**(等於被賦予的值)。
a = b = c
// 解析為
a = (b = c)
// 步驟:
// 1. 執行 b = c → b 得到 c 的值,表達式值為 c 的值
// 2. 執行 a = (上一步結果) → a 得到 c 的值
options = $.extend(defaults, options || {}); // ① 合併配置,結果賦給參數 options
this.options = options; // ② 將合併後的配置賦給實例屬性
執行前:
defaults ──► {a:1, b:2}
options ──► {b:20} (用戶傳入)
this.options ──► undefined
$.extend 返回新對象 merged = {a:1, b:20}
執行後:
options ──► merged
this.options ──► merged // 同一對象
// 修改 options.c = 3 → this.options.c 也為 3
| 誤解 | 事實 |
|---|---|
| 以為是聲明三個變量 | 無 `var/let/const`,`b` 和 `c` 若未聲明會成為全局變量(嚴格模式報錯) |
| 以為 `a=b=c` 會創建副本 | 對象賦值傳引用,三個變量指向**同一對象** |
| 以為順序是左到右 | 右結合:先算 `b=c`,再算 `a=結果` |