Javascript小巧靈活,能夠完成各種高難度的設計模式。下面要介紹的,只是其中之一。蘿卜白菜,各有所愛吧。沒什么標準可以鑒定好壞。
比如我們要定義人類:
function man(){}var a = new man()
人要有名:
function man(name) {this.Name = name}var a = new man('a')var b = new man('b')
可人也要有錢有車有房有人關注,等等,人要的東西太多,最好不要在造人的時候想著這些。只想著she就好了。
function man(she){this.she = she}var a = new man({Name:'a', Sex:'m'})a.she.Name = 'A'
我們不想把心里的she袒露出來。這樣,我們就需要一個閉包:
function man(she){ var Name, Sex return function(){Name = she.Name; Sex = she.Sex}}a = man({Name:'a', Sex:'m'})
但這樣就無法讀寫閉包包住的變量了。還好Javascript的函數也是對象,也就是可以直接讀寫屬性:
function man(){return function(){}}var a = man()a.Name = 'a'a.Sex = 'm'
改名容易:a.Name = 'A', 可我們不想隨便改性。這樣就需要getter/setter函數控制:
function man(){ var Name, Sex function my(){} my.Name = function(n){ if (!arguments.length) return Name Name = n return my } my.Sex = function(s) { if (!arguments.length) return Sex Sex = Sex ? Sex : s return my } return my}a = man()a.Sex('m')a.Sex('f')x = a.Sex() // 'm'
而且我們讓每個函數返回對象自身,就可以很容易的把函數串接在一起:
a = man().Name('a').Sex('m')
帶取置函數的閉包,就是我最為欣賞的對象。
--
fango