JavaScript設計模式

設計模式應該遵守得原則:

(1)最少知識原則:一個軟件實體應當儘可能少地與其他實體發生相互作用(把對象劃分成較小的粒度,以便提高複用性)

(2)開放-封閉原則:軟件實體(類、模塊、函數)等應該是可以擴展的,但是不可修改

一、原型模式

JavaScript基於原型的委託機制實現對象與對象之間的繼承。當對象無法響應某個請求時,會把該請求委託給它自己的原型。

構造器有原型,實例對象沒有原型,有一個名爲proto的屬性,其默認指向它的構造器的原型對象,即{constructor}.prototype.

示例一:


1.遍歷對象a中的所有屬性,未找到name屬性

2.查找name屬性的請求被委託給對象a的對象構造器的原型,它被a.proto記錄着並且指向A.prototype,而其被設置爲對象obj

3.在對象obj中找到name屬性,並返回

示例二:


1.首先遍歷對象a中的所有屬性,存在name屬性,但未賦值

示例三:


查找順序:

b對象 -> b.proto(即: B.prototype) -> new A() 對象 -> B.prototype -> obj

二:this

1.詞法作用域

首先明確JavaScript只具備詞法作用域(書寫代碼時函數聲明的位置來決定),不具備動態作用域。

示例一:


示例二:


示例三:


如果JavaScript存在動態作用域,第一個示例應該打印爲1

2.this

(1)this指向(構造器調用)

示例一:


示例二:


注意:

如果構造器顯式地返回一個object類型的對象,那麼此次運算最終返回這個對象,二不是我們之前期待的this。

3.指定函數內部this指向

call、apply、Function.prototype.bind,其中Function.prototype.bind部分瀏覽器不兼容

模擬實現Function.prototype.bind:


三、閉包和高階函數

1.閉包

對象以方法的形式包含了過程,而閉包則是在過程中以環境的形式包含了數據

示例:緩存機制


注意:

閉包容易導致循環引用,從而導致內存溢出。可以通過把這些變量設置爲null,回收這些變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章