WPTheme Java JavaScript…Yeah~!
Jul 01

  模拟私有属性

  好的,让我们看看闭包是怎么帮助我们模拟私有成员的吧。通常来说,一个函数内部的本地变量在外部是无法访问的。一旦函数创建,其内部所有的本地变量就消失了。但是,当其本地变量被闭包捕获后,它又复活了。这就是在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…

commentsOne Response to “翻译:利用面向对象技术创建高级WEB应用程序(6)”

  1. 偶爱偶妻 Says:

    学习中……

respondLeave a Reply