类变量/类方法/实例变量/实例方法
       js中,所有的方法都有一个call方法和apply方法,这两个方法可以模拟对象调用方法。它的第一个参数是对象,后面的参数表示对象调用这个方法时的参数。比如,我们定义了一个方法f(),然后调用下面的语句:
       f.call(0,1,2);
       作用相当于:
       o.m = f;
       o.m(1,2);
       delete o.m;
       举个例子:
       JS代码:(见附件test1.html)
       //定义方法
       function Person(name,age){
              this.name = name;
              this.age = age;
       }
 
       //空对象
       var o = new Object();
       //undefined_undefined
       alert(o.name + "_" + o.age);
 
       //相当于调用o.person("wangsy",31);
       Person.call(o,"wangsy",31);
       //wangsy_31
       alert(o.name + "_" + o.age);
       //apply方法作用同call,不同之处在于传递参数的形式是用数组来传递
       Person.apply(o,["wangsy",31]);
       //wangsy_31
       alert(o.name + "_" + o.age);
 
       实例变量和实例方法都是通过实例对象加”.”操作符然后跟上属性名或方法来访问的,但是我们也可以为类来设置方法或变量。这样就可以直接用类名加”.”操作符然后跟上属性名或方法来访问。定义类属性和类方法很简单。
       JS代码:(见附件test2.html)
       //定义类变量,创建的Person实例的个数
       Person.counter = 0;
       //定义方法
       function Person(name,age){
              this.name = name;
              this.age = age;
              //每创建一个实例,类变量加1
              Person.counter++;
       }
 
       //类方法,判断谁的年龄较大
       Person.whoIsOlder = function(p1,p2){
              if (p1.age > p2.age)
              {
                     return p1;
              }else{
                     return p2;
              }
       }
 
       var p1 = new Person("p1",18);
       var p2 = new Person("p2",22);
       //现在有2个人
       alert("现在有" + Person.counter + "个人");
       var p = Person.whoIsOlder(p1,p2);
       alert(p.name + "的年龄较大");
 
prototype属性的应用:
       假设定义了一个Circle类,有一个radisu属性和area方法,实现如下:
       JS代码:(见附件test3.html)
              function Circle(radius){
              this.radius = radius;
              this.area = function(){
                     return 3.14 * this.radius * this.radius;
              }
       }
 
       var c = new Circle(1);
       //3.14
       alert(c.area());
 
       假设我们定义了100Circle类的实例对象,那么每个实例对象都有一个radius属性和area方法,实际上除了radius属性,每个Circle类的实例对象的area方法都是一样的,可以把area方法抽出来定义在Circle类的prototype属性中,这样所有的实例对象就可以调用这个方法,从而节省空间。
       JS代码:(见附件test4.html)
       function Circle(radius){
              this.radius = radius;
       }
 
       Circle.prototype.area = function(){
              return 3.14 * this.radius * this.radius;
       }
 
       var c = new Circle(1);
       //3.14
       alert(c.area());
 
       现在,我们用prototype属性来模拟一下类的继承:首先定义一个Circle类作为父类,然后定义了子类PositionCircle
       JS代码:(见附件test5.html)
       //定义父类Circle
       function Circle(radius){
              this.radius = radius;
       }
 
       Circle.prototype.area = function(){
              //定义父类的方法area计算面积
              return 3.14 * this.radius * this.radius;
       }
 
       //定义PositionCircle
       function PositionCircle(x,y,radius){
              //属性横坐标
              this.x = x;
              //属性纵坐标
              this.y = y;
              //调用父类的方法,相当于调用this.Circle(radius)
              //设置PositionCircle类的radius属性
              Circle.call(this,radius);
       }
       //设置PositionCircle的父类为Circle
       PositionCircle.prototype = new Circle();
 
       var pc = new PositionCircle(1,2,1);
       //1
       alert(pc.radius);
       //Circle
       alert(pc.constructor);
 
       PositionCircle.prototype.constructor = PositionCircle;
       //PositionCircle
       alert(pc.constructor);