日期:2014-05-16  浏览次数:20314 次

javascript 类属性、类方法、类实例、实例属性、实例方法、prototype、__proto__ 测试与小结
<script>
   2:      function Circle( radius ){ 
   3:          this.r = radius; 
   4:          this.des = "圆形";
   5:          
   6:          this.showInfo = function(){
   7:              alert("这是一个"+this.des);
   8:  ?
   9:          }
  10:      }
  11:  ?
  12:      function Circle_area(r){ return Circle.PI*this.r*this.r; }
  13:  ?
  14:      function Circle_perimeter(r){ return  2*Circle.PI*r;}
  15:  ?
  16:      Circle.PI = 3.14;
  17:      Circle.perimeter = Circle_perimeter;
  18:      Circle.prototype.area = Circle_area;
  19:      
  20:      var c = new Circle(3);
  21:      
  22:      //测试类属性
  23:      //alert(Circle.PI )//3.14
  24:      //alert(c.PI)//undefined 因为类属性是和类本身,也就是函数本身相关联的,和类实例没有直接关系。
  25:      //alert(c.constructor.PI)//3.14 如果想通过类实例访问类属性,那么就需要先访问该实例的构造函数,进而访问该类属性
  26:      //alert(Circle.des)//undefined 因为函数Circle函数中的this.des中的this指代的不是函数本身,而是调用r的对象,而且只能是对象。
  27:      //alert(c.des)//圆形 this此时为实例化的 对象c。
  28:  ?
  29:      /*结论:
  30:          面向对象的角度:类属性是类对象的直接属性,且该属性与基于该类对象生成的实例对象没有直接关系,无法直接调用。
  31:          可以直接通过 类名.属性名 调用该类属性。如果想通过该类对象的实例对象调用类属性,那么可以使用 对象实例.constructor属性
  32:          调用该对象的类对象,然后通过类对象调用其类属性
  33:          javascript函数角度:类属性是javascript函数对象的直接属性变量(这里之所以称之为属性变量是由于javascript变量和属性的同一
  34:          性),且该属性变量与基于该函数对象构造出来的对象引用(生成了一个对象,这个对象实际上是一个空对象,并且保存了对构造
  35:          函数以及构造函数初始化时函数内部this关键字下的相关属性和函数的引用[c.prototype和构造函数中this.下面的相关属性、函数]:)
  36:          没有直接关系,如果想通过基于构造函数生成的对象c调用构造函数对象的属性变量PI,那么需要通过c.constructor属性找到该构造
  37: