方便更好的的理解單利模式,如下題
var n = 2;
var obj =
})(n)會報錯
};var fn = obj.fn;
fn(3);
obj.fn(3);
console.log(n, obj.n);
如圖所示 下面的思路
首先會形成乙個全域性作用域,變數提公升: var乙個 n var乙個 obj var乙個 fn 提公升後**自上而下執行 全域性下 n=2;obj (引用型別)首先開闢乙個堆記憶體(假設叫aaafff000),存值n:3 fn等於自執行函式返回值 ,自執行函式執行,假設形成叫aa的私有作用域,自執行函式執行時fn還沒有賦完值,fn堆記憶體裡面東西沒有存完,堆記憶體當中東西沒存完,就和obj就沒有關係,自執行函式執行時 此時 obj是undefined.
自執行函式執行第一步形參賦值 n=2,(這裡的n 是全域性變數的值),變數提公升 var n,在當前私有作用域aa中 ,當前變數已經宣告,不重複宣告 。重新賦值 n*=2 (此時私有的n=4)this.n+=2 (自執行函式 this指window 也就是全域性下的n ) 此時全域性下的n=4;下來var n=5 讓私有的n=5, return乙個函式 在aa中開闢乙個堆記憶體(假設叫bbbfff111) ,把返回函式的 this.n*= 2;console.log(m + (++n));當字串儲存起來,即 return bbbfff111 bbbfff111屬於aa aaafff000中的fn通過aa指向bbbfff111,存fn自執行函式執行形成乙個不銷毀的私有作用域aa,不銷毀作用域aa中有乙個不銷毀的變數n(5),並且返回了乙個全新的堆記憶體 給obj物件 fn的屬性名(fn:bbbfff111) 堆記憶體(aaafff000中 fn)存值儲存完成, 把堆記憶體的位址賦值給 obj 此時obj和aaafff000建立聯絡(obj=aaafff000),
fn=obj.fn fn執行 fn(3) fn=bbbfff111 形參賦值(m=3)this.n*=2 this指window (4*2)此時全域性下的n=8
3+(++n) 此時n是上級作用域 aa (5) ++5 =6 n=6 3+6 輸出9
obj.fn(3)
obj.fn m=3 this.n*=2 此時this指 obj obj的n是3 3*2=63+(++n) n 上級作用域n就是aa ++6 n=7 3+7 輸出10
console.log(n, obj.n); 全域性下的n =8 obj.n=6
JS高階物件 高階類 或稱Mixin模式
mixin模式,混合模式。這是一種不用繼承就可以復用的技術。主要還是為了解決多重繼承的問題。多繼承的繼承路徑是個問題 js是基於物件的,類和物件都是物件模板 混合mixin,指的是將乙個物件的全部或者部分拷貝到另乙個物件上去。其實就是屬性了 可以將多個類或物件混合成乙個類或物件 class seri...
JS 高階物件 高階類或稱Mixin模式
高階物件實現 mixin模式,混合模式 js是基於物件的,類和物件都是物件模板 混合mixin,指的是將乙個物件的全部或者部分拷貝到另乙個物件上去。其實就是屬性 可以將多個類或物件混合成乙個類或物件 繼承 子子孫孫都有基類的功能 class serialization class point ext...
JS高階教程知識整理 13繼承模式
01.原型鏈繼承 方式一 原型鏈繼承 1.套路 1.定義父型別建構函式 2.給父型別的原型新增方法 3.定義子型別建構函式 4.建立父型別的物件賦值給子型別的原型 5.將子型別的構造屬性設定為子型別 6.給子型別原型新增方法 7.建立子型別的物件,可以呼叫父型別的方法 2.關鍵 1.子型別的原型為父...