我最欣賞的Javascript物件

fango發表於2012-06-19

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

相關文章