特权
特权方法可以访问私有变量和方法,并且其自身对于公共方法和对象外部都是可访问地。可以删除或者替换一个特权方法,但是不能改变它,或者强迫它泄密。
特权方法是在构造函数内使用 this 指定地。
function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } this.member = param; var secret = 3; var that = this; this.service = function () { if (dec()) { return that.member; } else { return null; } }; }
service 就是特权方法。前三次调用 myContainer.service() 时会返回 ‘abc’。之后返回空(null)。service 调用了可访问私有变量 secret 的私有方法 dec。service 对其他对象和方法都是可见的,但是不能直接访问私有成员。
闭包
由于 Javascript 有闭包,因此这种公共,私有和特权成员模型时可以的。这意味着内部函数总是可以访问它外部函数的变量和参数,甚至在外部函数返回后也可以。这是这个语言一个非常有用的特性。目前没有任何关于 Javascript 编程的书描述了如何利用它。大部分甚至都不提及它。(糖伴西红柿说,这是2001年的文章,当时估计还没有这方面的研究文章。现在来说,犀牛书等都有涉及,javascript 的难点之一啊。)
私有和特权成员只在对象被创建时生成。公共成员可以随时添加。
模式
公共
function Constructor(...) { this.membername = value; } Constructor.prototype.membername = value;
私有
function Constructor(...) { var that = this; var membername = value; function membername(...) {...} }
注意:函数语句
function membername(...) {...}
是
var membername = function membername(...) {...};
的缩写。
特权
function Constructor(...) { this.membername = function (...) {...}; }
糖伴西红柿说:
好久没露面,本来就没人记得我,这次更无名了。最近从高丽迁移回了天朝,嗯。而且正在为了工作进行最后的充电活动。生活中同时也遭遇到电视剧情节,还是高丽电视剧。这两天在主攻 Javascript 中几个比较难的知识点,闭包算是其中之一。两天看了好多关于闭包的文章,才有点开窍,这篇文章属于其中之一。算是个额外的参考资料,主要的是另一篇英文文章,有打算全篇翻译。
原文地址:http://www.crockford.com/javascript/private.html 译文地址:http://www.qianduan.net/?p=6580
本文链接:http://www.blueidea.com/tech/web/2009/6538.asp
出处:前端观察
责任编辑:bluehearts
上一页 JavaScript的私有成员 [1] 下一页
◎进入论坛网页制作、WEB标准化版块参加讨论,我还想发表评论。
|