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

Javascript
javascript innerText和innerHtml应用
图像替换新技术 状态域方法
JavaScript 判断判断某个对象是Object还是一个Array
Extjs 几个方法的讨论
JavaScript 学习笔记(十五)
javascript 匿名函数的理解(透彻版)
Jquery 常用方法经典总结
jquery 批量上传图片实现代码
javascript中的array数组使用技巧
详细讲解JS节点知识
javascript让setInteval里的函数参数中的this指向特定的对象
javaScript 关闭浏览器 (不弹出提示框)
对字符串进行HTML编码和解码的JavaScript函数
javascript 三种编解码方式
js左侧多级菜单动态的解决方案
JavaScript 学习笔记(十六) js事件
JavaScript面向对象之静态与非静态类
javascript两段代码,两个小技巧
js中鼠标滚轮事件详解(firefox多浏览器)
js实现的仿Photoshop鼠标滚轮控制输入框取值(修正兼容Chrome)

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 108 ::
收藏到网摘: 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 中几个比较难的知识点,闭包算是其中之一。两天看了好多关于闭包的文章,才有点开窍,这篇文章属于其中之一。算是个额外的参考资料,主要的是另一篇英文文章,有打算全篇翻译。