在JavaScript中定义类的步骤可以缩减为一个分三步的算法。

第一步:先定义一个构造函数,并设置初始化新对象的实例属性;

第二步:给构造函数的prototype对象定义实例的方法;

第三步:给构造函数定义类字段和类属性。

下面示例的代码定义了一个表示复数的类,重点关注如何用JavaScript来模拟实现Java式的类成员:


/**
 * complex.js:这个文件定义了Complex类,用来描述复数
 * 复数是实数和虚数的和,并且虚数i是-1的平方根
 */

/**
 * 这个构造函数为它所创建的每个实例定义了实例字段r和i
 * 这两个字段分别保存复数的实部和虚部
 * 它们是对象的状态
 */
function Complex(real,imaginary){
    if(isNaN(real) || isNaN(imaginary)){//确保两个实参都是数字
        throw new TypeError();//如果不都是数字则抛出错误
    }
    this.r=real;        //复数的实部
    this.i=imaginary;   //复数的虚部
}

/**
 * 类的实例方法定义为原型对象的函数值属性
 * 这里定义的方法可以被所有实例继承,并且为它们提供共享的行为
 * 需要注意的是,JavaScript的实例方法必须使用关键字this来存取实例的字段
 */

//当前复数对象加上另外一个复数,并返回一个新的计算和值后的复数对象
Complex.prototype.add=function(that){
    return new Complex(this.r+that.r,this.i+that.i);
};
//当前复数乘以另外一个复数,并返回一个新的计算乘积之后的复数对象
Complex.prototype.mul=function(that){
    return new Complex(this.r*that.r-this.i*that.i,this.r*that.i+this*that.r);
}
//计算复数的模,复数的模的定义为原点(0,0)到复平面的距离
Complex.prototype.mag=function(){
    return Math.sqrt(this.r*this.r+this.r+this.i);
}
//复数的求负运算
Complex.prototype.neg=function(){
    return new Complex(-this.r,-this.i);
}
//将复数对象转换为一个字符串
Complex.prototype.toString=function(){
    return "{"+this.r+","+this,i+"}";
}
//检测当前复数对象是否和另外一个复数值相等
Complex.prototype.equals=function(that){
    return that!=null &&                      //必须有定义且不能是null
           that.constructor === Complex &&    //并且必须是Complex的实例
           this.r===that.r && this.i===that.i;//并且必须包含相同的值
}

/**
 *类字段(比如常量)和类方法直接定义为构造函数的属性
 * 需要注意的是,类的方法通常不使用关键字this
 * 它们只对其参数进行操作
 */
//下面定义一些对复数运算有帮助的类字段(常量)
Complex.ZERO=new Complex(0,0);
Complex.ONE=new Complex(1,0);
Complex.I=new Complex(0,1);
//下面这个类方法由实例对象的toString方法返回的字符串格式解析为一个Complex对象
//或者抛出一个类型错误异常
Complex.parse=function(s){
    try{//假设解析成功
        var m=Complex._format.exec(s);//利用正则表达式进行匹配
        return new Complex(parseFloat(m[1]),parseFloat(m[2]));
    }catch(x){
        throw new TypeError("不能将"+s+"解析为数字");
    }
};
//定义类的"私有"字段,这个字段在Complex.parse()中用到了
//下划线前缀表明它是类内部使用的,而不属于类的公有API的部分
Complex._format=/^\{([^,]+),([^}]+)\}$/;

//下面这段示例代码调用构造函数、实例字段、实例方法、类字段和类方法
var c=new Complex(2,3); //使用构造函数创建新的对象
var d=new Complex(c.i, c.r);//用到了c的实例属性
c.add(d).toString();//=>"{5,5}":使用了实例的方法
//下面这个复杂的表达式用到了类方法和类字段
Complex.parse(c.toString()).    //将c转换为字符串
add(c.neg()).                   //加上它的负数
equals(Complex.ZERO);           //结果应当永远是"零"