- 原文:Create Advanced Web Applications With Object-Oriented Techniques
- 译文(因文章较长,分多篇贴出,此篇为第6部分):
模拟私有属性
好的,让我们看看闭包是怎么帮助我们模拟私有成员的吧。通常来说,一个函数内部的本地变量在外部是无法访问的。一旦函数创建,其内部所有的本地变量就消失了。但是,当其本地变量被闭包捕获后,它又复活了。这就是在JavaScript中模拟私有属性的关键之处。请看下面的Person类:
function Person(name, age) {
this.getName = function() { return name; };
this.setName = function(newName) { name = newName; };
this.getAge = function() { return age; };
this.setAge = function(newAge) { age = newAge; };
}
参数name和age对于Person构造函数来说属于本地变量。当Person返回时,假定参数name和age已经消失了,但当他们被4个内部函数捕获后,就复活回来了。而这4个内部函数是作为Person对象的方法而存在的,而name和age就严格地通过这4个方法来访问。所有你可以这样做:
var ray = new Person("Ray", 31);
alert(ray.getName());
alert(ray.getAge());
ray.setName("Younger Ray");
// Instant rejuvenation!
ray.setAge(22);
alert(ray.getName() + " is now " + ray.getAge() + " years old.");
在构造函数中的本地函数也可以在构造时,不进行初始化,如下:
function Person(name, age) {
var occupation;
this.getOccupation = function() { return occupation; };
this.setOccupation = function(newOcc) { occupation =
newOcc; };
// accessors for name and age
}
请注意,这些私有成员与我们在C#中所期望的稍有所不同。在C#中,类的仅有成员可以访问到它的私有成员。但在JavaScript中,必须通过拥有私有成员的、形成闭包的方法(这些方法与通常的公共方法稍有区别,我们称之为特权方法)。所以在Person的系列公共方法中,你仍然需要通过它的特权方法来访问它(Person)的私有成员:
Person.prototype.somePublicMethod = function() {
// doesn't work!
// alert(this.name);
// this one below works
alert(this.getName());
};
Douglas Crockford就是第一个发现(或者公开发表)这个用闭包来模拟私有成员的方法。他的主页javascript.crockford.com中就有大量的关于JavaScript的信息,如果你对JavaScript有兴趣的话,我推荐你上去看一看。
To be Continued…


One Response to “翻译:利用面向对象技术创建高级WEB应用程序(6)”
Leave a Reply
July 4th, 2007 at 2:42 pm
学习中……