分享

图灵社区 : 阅读 : 我最欣赏的Javascript对象

 看见就非常 2012-07-02

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多