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: