javascript面向对象技术基础(五)(类变量/类方法/实例变量/实例方法)

类变量/类方法/实例变量/实例方法
先补充一下以前写过的方法:
在javascript中,所有的方法都有一个call方法和apply方法.这两个方法可以模拟对象调用方法.它的第一个参数是对象,后面的
参数表示对象调用这个方法时的参数.比如我们定义了一个方法f(),然后调用下面的语句:
f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m;
举个例子:

Js代码   收藏代码
  1. function Person(name,age) {  //定义方法  
  2.     this.name = name;  
  3.     this.age = age;  
  4. }  
  5. var o = new Object();   //空对象  
  6. alert(o.name + "_" + o.age); //undefined_undefined  
  7.   
  8. Person.call(o,"sdcyst",18); //相当于调用:o.Person("sdcyst",18)  
  9. alert(o.name + "_" + o.age); //sdcyst_18  
  10.   
  11. Person.apply(o,["name",89]);//apply方法作用同call,不同之处在于传递参数的形式是用数组来传递  
  12. alert(o.name + "_" + o.age); //name_89  

 ---------------------------------

实例变量和实例方法都是通过实例对象加"."操作符然后跟上属性名或方法名来访问的,但是我们也可以为类来设置方法或变量,
这样就可以直接用类名加"."操作符然后跟上属性名或方法名来访问.定义类属性和类方法很简单:

Js代码   收藏代码
  1. Person.counter = 0;   //定义类变量,创建的Person实例的个数  
  2. function Person(name,age) {  
  3.     this.name = name;  
  4.     this.age = age;  
  5.     Person.counter++; //没创建一个实例,类变量counter加1  
  6. };  
  7.   
  8. Person.whoIsOlder = function(p1,p2) { //类方法,判断谁的年龄较大  
  9.     if(p1.age > p2.age) {  
  10.         return p1;  
  11.     } else {  
  12.         return p2;  
  13.     }  
  14. }  
  15.   
  16. var p1 = new Person("p1",18);  
  17. var p2 = new Person("p2",22);  
  18.   
  19. alert("现在有 " + Person.counter + "个人");  //现在有2个人  
  20. var p = Person.whoIsOlder(p1,p2);  
  21. alert(p.name + "的年龄较大");   //p2的年龄较大  

 

prototype属性的应用:
下面这个例子是根据原书改过来的.
假设我们定义了一个Circle类,有一个radius属性和area方法,实现如下:

Js代码   收藏代码
  1. function Circle(radius) {  
  2.     this.radius = radius;  
  3.     this.area = function() {  
  4.         return 3.14 * this.radius * this.radius;  
  5.     }  
  6. }  
  7. var c = new Circle(1);  
  8. alert(c.area());  //3.14  

 假设我们定义了100个Circle类的实例对象,那么每个实例对象都有一个radius属性和area方法,
实际上,除了radius属性,每个Circle类的实例对象的area方法都是一样,这样的话,我们就可以
把area方法抽出来定义在Circle类的prototype属性中,这样所有的实例对象就可以调用这个方法,
从而节省空间.

Js代码   收藏代码
  1. function Circle(radius) {  
  2.     this.radius = radius;  
  3. }  
  4. Circle.prototype.area = function() {  
  5.         return 3.14 * this.radius * this.radius;  
  6.     }  
  7. var c = new Circle(1);  
  8. alert(c.area());  //3.14  

 

现在,让我们用prototype属性来模拟一下类的继承:首先定义一个Circle类作为父类,然后定义子类
PositionCircle.

Js代码   收藏代码
  1. function Circle(radius) {  //定义父类Circle  
  2.     this.radius = radius;  
  3. }  
  4. Circle.prototype.area = function() { //定义父类的方法area计算面积  
  5.     return this.radius * this.radius * 3.14;  
  6. }  
  7.   
  8. function PositionCircle(x,y,radius) { //定义类PositionCircle  
  9.     this.x = x;                    //属性横坐标  
  10.     this.y = y;                    //属性纵坐标  
  11.     Circle.call(this,radius);      //调用父类的方法,相当于调用this.Circle(radius),设置PositionCircle类的  
  12.                                    //radius属性  
  13. }  
  14. PositionCircle.prototype = new Circle(); //设置PositionCircle的父类为Circle类  
  15.   
  16. var pc = new PositionCircle(1,2,1);  
  17. alert(pc.area());  //3.14  
  18.                    //PositionCircle类的area方法继承自Circle类,而Circle类的  
  19.                    //area方法又继承自它的prototype属性对应的prototype对象  
  20. alert(pc.radius); //1  PositionCircle类的radius属性继承自Circle类  
  21.   
  22. /* 
  23. 注意:在前面我们设置PositionCircle类的prototype属性指向了一个Circle对象, 
  24. 因此pc的prototype属性继承了Circle对象的prototype属性,而Circle对象的constructor属 
  25. 性(即Circle对象对应的prototype对象的constructor属性)是指向Circle的,所以此处弹出 
  26. 的是Circ. 
  27. */  
  28. alert(pc.constructor); //Circle      
  29.   
  30. /*为此,我们在设计好了类的继承关系后,还要设置子类的constructor属性,否则它会指向父类 
  31. 的constructor属性 
  32. */  
  33. PositionCircle.prototype.constructor = PositionCircle  
  34. alert(pc.constructor);  //PositionCircle 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值