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
|