当前位置: 首页 > 图文教程 > 网络编程 > Javascript > javascript的私有成员(private)

Javascript
动态生成select选项全接触
不刷新页面动态更新select选项,实现两个select相互操作
网页输入框日期型有效性判定一网打尽
实用Javascript函数之一(自动将输入文本框中的内容转换成大写字符)
实用Javascript函数之二(自动将输入文本框中的内容转换成小写字符)
实用Javascript函数之三(限制文本输入框中只能输入数字\"0\"到\"9\")
实用Javascript函数之四(用于对sString字符串进行前空格截除)
实用Javascript函数之五(用于对sString字符串进行后空格截除)
实用Javascript函数之六(截除字符串前后空格)
如何使用交替的滚动标题
采用DOM模型时创建一个Select节点后,要删除option项的解决方法
javascript函数速查
利用JavaScript和正则表达式进行丰富的日期判断(给其它项目组的代码,有比较好的编程风格和注释)
关于字符串的几个有用函数
FileSystemObject 的例子(处理驱动器、文件夹、文件)
用JScript实现VB.Net,C#的[委托Delegate]:
得到固定字符位置的函数
IE NC通用的藏鼠标右键一法
Menu
foolpot2001菜单

Javascript 中的 javascript的私有成员(private)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 100 ::
收藏到网摘: n/a

对象

Javascript 根本上是和对象相关的。数组是对象。函数是对象。对象是对象。那什么是对象呢?对象是名-值对的集合。名是字符串,值可以是字符串,数字,布尔值或者对象(包括数组和函数)。通常对象是像哈希表一样执行地,这样便于值地快速检索。

如果值是函数,我们可以认为这是一个方法。当一个对象地方法被调用的时候,this 变量就设置为这个对象。方法就可以通过 this 变量来访问实例变量。

对象可以由用来初始化对象的构造函数生成。构造函数提供了其他语言中类所提供的特性,包括静态变量和方法。

公共

对象的成员全部是公共成员。任何函数都可以访问、修改或者删除这些成员,或者增加新成员。有两种向新对象中添加成员的方法:

在构造函数中添加

这个技术通常用于初始化公共实例变量。使用构造函数的 this 变量向对象中添加成员。

function Container(param){
 this.member = param;
}

这样,如果我们创建一个新对象:

 var myContainer = new Container('abc');

这样 myContainer.member 就包含 ‘abc’ 了。

在原型中添加

这个技术通常用于添加公共方法。当一个成员被检索并且没能在对象本身里面找到时,就要从对象的构造函数的原型成员里面寻找。原型机制是用于继承的。也用于节省内存。向一个构造函数生成的所有对象中添加一个方法,只需要向构造函数原型中添加一个函数:

 Container.prototype.stamp = function(string){
  return this.member + string;
 }

因此,我们可以调用这个方法:

 myContainer.stamp('def')

结果为 ‘abcdef’。

私有

私有成员是由构造函数生成的。一般构造函数的变量和参数都是私有成员。

 function Container(param){
  this.member = param;
  var secret = 3;
  var that = this;
 }

这个构造函数生成了3个私有实例变量:param,secret 和 that。它们和对象相关联,但是它们不仅在函数外边不可访问,而且对对象自身的公共方法来说也是不可访问的。它们只可以被私有方法访问。私有方法是构造函数的内部函数。

function Container(param) {
 
    function dec() {
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }
 
    this.member = param;
    var secret = 3;
    var that = this;
}

私有方法 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 指定地。

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 中几个比较难的知识点,闭包算是其中之一。两天看了好多关于闭包的文章,才有点开窍,这篇文章属于其中之一。算是个额外的参考资料,主要的是另一篇英文文章,有打算全篇翻译。