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
联系客服