Private Members In JavaScript(javascript的私有成员)——翻译

翻译大半,发现有人翻译过了,而且翻译地还比较好。但是还是硬着头皮翻下去了,并参考他的做了修改,就作为我翻译e文的第一次吧。


原文:http://javascript.crockford.com/private.html

    javascript是全世界最被误解的语言。有些人觉得它缺少隐藏信息的机制,因为javascript的对象没有私有变量和方法。但这是种误解。javascript也有私有成员。让我们看看吧。

对象:

    javascript是基于对象的。数组(Arrays)是对象,函数(Functions)是对象,对象尼玛也是对象。什么是对象呢?对象是名-值的集合。名是字符串,值可以是字符串,数字,布尔型和对象(包括数组和函数)。通常对象会被实现为hashtables,这样数据就可以很快地获取。

     如果值是函数,我们可以把它当做一个方法。当方法被对象调用,这个变量会被赋予到这个对象。这个方法可以获取对象的变量。

     对象可以通过(constructors)构造函数创造,构造函数提供的功能包括静态变量和方法。

共有成员:

    对象中所有的方法都是共有的。任何函数都可以调用,修改或者删除,或者增加新的方法。这里有两种主要的方式来增加成员到一个新对象中:

利用构造函数:

这种技巧通常被用在初始化公共实体变量,构造函数的this变量被用来增加共有变量到对象中。

function Container(param) {
    this.member = param;
}
所以,如果我们构造一个对象 

var myContainer = new Container('abc');

那么 myContainer.member 包括 ’abc‘。

利用原型

这种技巧通常会被用到增加共有方法。当查到一个成员而在相应对象中没有找到时,就会去构造函数的portotype中寻找。原型的原理常被用来实现继承。它同时也节省内存。如果要添加一个方法到所有的对象实例中,可以通过在构造函数的原型中添加一个函数来实现:

Container.prototype.stamp = function (string) {
    return this.member + string;
}
然后,我们可以这样调用:myContainer.stamp('def')。

结果返回'abcedf'。

私有成员:

私有变量通过构造函数实现,普通的var变量和构造函数的参数将变成私有成员。

function Container(param) {
    this.member = param;
    var secret = 3;
    var that = this;
}
这个构造函数创建了3个参数:param,secret和that。它们都能被对象内部访问,但是无法从外面被访问。它们可以访问对象的共有方法,也可以被私有方法访问,私有方法是构造函数的内部函数。

   function dec() {
        if (secret > 0) {
            secret -= 1;
            return true;
        } else {
            return false;
        }
    }

    this.member = param;
    var secret = 3;
    var that = this;
}
私有方法dec检查实例变量secret。如果大于0,secret减去1,并返回true,否则返回false。这种方式可以用在限制这个对象的使用次数。按照惯例,我们定义一个私有的变量that。它被用于让对象对私有方法可见,这是ECMAScript语言规范的一个错误,引起this变量不能正确地对内部函数进行复制的一个解决方法。私有方法不能被共有方法返回。为了使私有方法更有用,我们需要一种方法:特权方法。


特权方法

特权方法可以访问私有变量和方法,对共有方法也是可见的。一个特许方法可能被删除或者替换,但是不可以修改它,除非完全被替换。

privileged 方法被分配给构造函数的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 () {
        return dec() ? that.member : null;
    };
}

service是一个特许方法,前3次调用myContainer.service()会返回‘abc’,之后会返回null。service方法调用了私有方法dec,以便访问私有变量seret。service同样对其它对象和方法也是可见的,但是它不允许直接访问私有属性。


Closurs(闭包)

public,private和privileged等模式之所以存在,是因为javascript·拥有闭包属性。闭包在这里的意思是内部的函数可以调用外部的函数,即使外部函数已经返回了。这个是非常有用的一种特性。目前还没有书介绍如何利用 这个特性,有些甚至都没有提到。

私有成员和特权成员只有在对象构造的时候实现,公有成员可以在任何时候增加。

编写模式

public

function Constructor(...) { 
        this.membername = value; 
}
Constructor.prototype.membername = value;
private

function Constructor(...) { 
        var that =this; 
        var membername = value; 
        function membername(...) {...} 
} 
注意:函数声明function membername(...){...} 是下面这句var membername = function membername(...){...}的缩写;

privileged:

function Constructor(...) { 
        this.membername = function (...) {...}; 
}



thomescai http://blog.csdn.net/thomescai(转载请保留) 

参考资料:

 http://www.funnyhao.com/test/private-members-in-js.html 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值