如何在JavaScript中定义类?

这两天比较闲,所以补习点JavaScript的基础知识。
下面是定义一个Person类的代码示例,定义了三个成员变量和三个对应的成员函数。
[js]
var Person = function(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;

// 第一种方式
this.getName=getPersonName;

// 第二种方式
this.getAge = function(){
return this.age;
}
}
function getPersonName(){
return this.name;
}
// 第三种方式
Person.prototype.getGender = function(){
return this.gender;
}

// 用new生成新的Person对象
var p1 = new Person('a',25,'male');
var p2 = new Person('b',24,'female');
alert(p1.getPersonName===p2.getPersonName); // true
alert(p1.getAge===p2.getAge); // false
alert(p1.getGender===p2.getGender); // true
[/js]
上面的例子中,给Person类使用三种不同的方式定义了三个成员函数。
第一种方式,把成员函数getName指向一个外部函数getPersonName,外部函数定义在全局的Namespace下,这明显不符合OO中的“封装”的性质。
第二种方式,getAge是一个内部函数,但是缺点是在每次创建一个Person对象时都会为这个对象生成一个getAge函数。这可以从 (p1.getAge===p2.getAge) == false 验证出来。
第三种方式是最推荐的方式,函数getGender是一个内部函数,且被所有的Person对象共享。

如果我们只需要一个实例对象(类似于Singleton),也可以使用下面更加便捷的定义方式:
[js]
//function前面加new,实际上是一个anonymous类。
var p4 = new function(){
this.name='d';
this.age=23;
this.gender='female';
this.getName= function(){ return this.name; },
this.getAge= function(){ return this.age; },
this.getGender= function(){ return this.gender; }
};
// JavaScript Object Notation,比上面的定义方式更为便捷
var p3 = {
name:'c',
age:24,
gender:'male',
getName: function(){ return this.name; },
getAge: function(){ return this.age; },
getGender: function(){ return this.gender; }
};
// p3,p4已经是对象实例,可以直接使用
alert(p3.getName());
alert(p4.getAge());
[/js]

上面的例子都是很原始的方式,如果要实现高级点的类,比如private和public的成员变量,还需要一些技巧,比如Module Pattern

VIA

Comments