原始問題
(function() {
function Fun(name) { this.name = name; }
Fun.prototype.say = function() { console.log(this.name); }
fun = new Fun(); // 未傳參
})();
fun.say('qwe'); // 想傳參但無效
解法:IIFE 接收參數並傳給建構函數
(function(name) { // 1. IIFE 接收外部參數
function Fun(name) { this.name = name; }
Fun.prototype.say = function() { console.log(this.name); }
fun = new Fun(name); // 2. 建構時傳入
})('qwe'); // 3. 立即呼叫並傳入 'qwe'
fun.say(); // 輸出: qwe
原理解析
- IIFE (立即呼叫函數表達式) 建立私有作用域,參數
name 只在該作用域有效。
- 建構函數
Fun 內部 this.name 指向實例屬性,原型方法 say 讀取 this.name。
- 外部變數
fun (隱性全域) 持有實例參考,後續可直接呼叫 fun.say()。
進階模式:模組化導出
const MyModule = (function(name) {
function Fun(name) { this.name = name; }
Fun.prototype.say = function() { console.log(this.name); }
return new Fun(name); // 直接回傳實例
})('qwe');
MyModule.say(); // qwe