Javascript的私有成员
对象
Javascript 根本上是和对象相关的。数组是对象。函数是对象。对象是对象。那什么是对象呢?对象是名-值对的集合。名是字符串,值可以是字符串,数字,布尔值或者对象(包括数组和函数)。通常对象是像哈希表一样执行地,这样便于值地快速检索。
如果值是函数,我们可以认为这是一个方法。当一个对象地方法被调用的时候,this 变量就设置为这个对象。方法就可以通过 this 变量来访问实例变量。
对象可以由用来初始化对象的构造函数生成。构造函数提供了其他语言中类所提供的特性,包括静态变量和方法。
公共
对象的成员全部是公共成员。任何函数都可以访问、修改或者删除这些成员,或者增加新成员。有两种向新对象中添加成员的方法:
在构造函数中添加
这个技术通常用于初始化公共实例变量。使用构造函数的 this 变量向对象中添加成员。
这样,如果我们创建一个新对象:
这样 myContainer.member 就包含 ‘abc’ 了。
在原型中添加
这个技术通常用于添加公共方法。当一个成员被检索并且没能在对象本身里面找到时,就要从对象的构造函数的原型成员里面寻找。原型机制是用于继承的。也用于节省内存。向一个构造函数生成的所有对象中添加一个方法,只需要向构造函数原型中添加一个函数:
因此,我们可以调用这个方法:
结果为 ‘abcdef’。
私有
私有成员是由构造函数生成的。一般构造函数的变量和参数都是私有成员。
这个构造函数生成了3个私有实例变量:param,secret 和 that。它们和对象相关联,但是它们不仅在函数外边不可访问,而且对对象自身的公共方法来说也是不可访问的。它们只可以被私有方法访问。私有方法是构造函数的内部函数。
私有方法 dec 检查 secret 实例变量。如果它大于零,将其减一并返回 true。否则返回 false。它可以用作限定对象使用3次。
按照习惯,我们设置了一个私有的 that 参数。它使得这个对象对于私有方法使可见的。在 ECMAScript 语言规范中,这是一个可行的错误,它使得 this 对于内部函数被不正确地设置。(This is a workaround for an error in the ECMAScript Language Specification which causes this to be set incorrectly for inner functions.)
私有方法不能被公共方法调用。要想使得私有方法有用,需要介绍一下特权方法。
特权
特权方法可以访问私有变量和方法,并且其自身对于公共方法和对象外部都是可访问地。可以删除或者替换一个特权方法,但是不能改变它,或者强迫它泄密。
特权方法是在构造函数内使用 this 指定地。
service 就是特权方法。前三次调用 myContainer.service() 时会返回 ‘abc’。之后返回空(null)。service 调用了可访问私有变量 secret 的私有方法 dec。service 对其他对象和方法都是可见的,但是不能直接访问私有成员。
闭包
由于 Javascript 有闭包,因此这种公共,私有和特权成员模型时可以的。这意味着内部函数总是可以访问它外部函数的变量和参数,甚至在外部函数返回后也可以。这是这个语言一个非常有用的特性。目前没有任何关于 Javascript 编程的书描述了如何利用它。大部分甚至都不提及它。(糖伴西红柿说,这是2001年的文章,当时估计还没有这方面的研究文章。现在来说,犀牛书等都有涉及,javascript 的难点之一啊。)
私有和特权成员只在对象被创建时生成。公共成员可以随时添加。
模式
公共
私有
注意:函数语句
是
的缩写。
特权
糖伴西红柿说:
好久没露面,本来就没人记得我,这次更无名了。最近从高丽迁移回了天朝,嗯。而且正在为了工作进行最后的充电活动。生活中同时也遭遇到电视剧情节,还是高丽电视剧。这两天在主攻 Javascript 中几个比较难的知识点,闭包算是其中之一。两天看了好多关于闭包的文章,才有点开窍,这篇文章属于其中之一。算是个额外的参考资料,主要的是另一篇英文文章,有打算全篇翻译。
原文地址:http://www.crockford.com/javascript/private.html
译文地址:http://www.qianduan.net/?p=6580
- March 2009
- 23
- 糖伴西红柿
- 经验技巧
- Comments (2)
- Tags: JavaScript —
Everything is New.
花了两天时间,把小黑重新整理了一下,弄了一个即好用又好看的系统
顺便也个小二黑换了主题,加上漂亮的壁纸,哈哈

- February 2009
- 28
- 糖伴西红柿
- {a}Live
- Comments (4)
- Tags: life, 生活 —
运算符优先级 – (i=1)*i– – –i*(i=-3)*i++ + ++i 等于什么和为什么?
为什么关心?
对于任何一种人类语言来说,最好是即可以说出这用语言,也可以理解它。任何人都可以从互联网上复制粘贴
一段代码到他们的项目中,就像任何人都可以使用 google 翻译“说”法语一样。但是当那些复制来的代码没有
像你想要的那样工作的时候,会发生什么?显然会有百万零三种可能,在这些令人苦恼和压抑的环境下,对这个语言有更多的了解就真正的起到作用了。尽管如此,我不打算在这篇文章里对任何特定语言写些什么;我将会讨论一种小说式语言 CGCSL (Clinton’s Generic C Style Language 克林顿的通用c样式语言),就如名称所说,这些基本原则将(大部分)适用于任何c样式语言( PHP, JavaScript , Java小等)。 (more…)
- February 2009
- 26
- 糖伴西红柿
- 经验技巧
- Comments (0)
- Tags: JavaScript —
Desktoptopia – 自动更换壁纸
嗯,今天 84 生日,祝生日快乐
还有,多谢鸟兄的惦记,我很好,这里肯定会一直更新下去,最近不是没发文章,而是主要精力放在学习以及 前端观察 上了
今天给大家推荐一款自动更换壁纸的软件,Desktoptopia
有多个分类可以选择,可以对壁纸进行评级,设定更新时间等
提供的壁纸都不是一般的精美,那是相当精美哇
软件有 PC 和 Mac 两种版本,个人感觉还是 Mac 版本比较舒服
嗯,自从有了 [小二黑] 之后,我就无情的把 [小黑 ] 抛给了 小春,嘿嘿。。。
链接:Desktoptopia
F.lux
好久没给大家推荐啥软件了,这次带来的是一个挺有意思的软件 – F.lux
F.lux 使显示器按照时间的推移发生相应的改变。晚上是显示器显得比较温暖,而白天则会是像阳光一样的颜色。
有点像gmail某些主题是随时间变化而变化的一样。
实用价值嘛,我感觉一般,不过挺有意思。有变化总归是有意思的事情,千篇一律太枯燥了。
虽然这么说,F.lux 却有 windows,Mac,Linux 下的各种版本,很强大啊。
设置比较简单,选择一种光线样式,然后填上所处纬度就行了,官方主页提供了一个查找纬度的方式。
需要注意的是只需要一个纬度值就可以了
例如 35°59′N 126°43′E,只需要把 35 填上就可以了。
其他的,就像官方说的,jiust forget it。
http://stereopsis.com/flux/
- February 2009
- 24
- 糖伴西红柿
- 共享资源
- Comments (1)
- Tags: software, 软件 —






















