javascript里构建类的4种方式

来源:互联网 发布:大学手机必备软件 编辑:程序博客网 时间:2024/06/05 20:49
javascript里构建类主要有4种方式 
1.构造方式定义类 
2.原型方式定义类 
3.构造和原型结合方式创建类 
4.动态的原型方式 

各有优缺点,具体如下 
1.构造方式定义类,优点:多个实例对象不共享类的属性值,缺点:每个实例对象都会产生出一个函数say 

Java代码  收藏代码
  1. //构造方式定义类,优点:多个实例对象不共享类的属性值,缺点:每个实例对象都会产生出一个函数say  
  2. function User(){  
  3.     this.username = "zhangsan";//this.不能丢  
  4.       
  5.     this.say = function(){//this.不能丢  
  6.         alert("username:" + this.username );//this.不能丢  
  7.     }  
  8.     //下面注释的这种写法不对  
  9. //  function say(){  
  10. //      alert("username:" + this.username );  
  11. //  }  
  12. }  
  13.   
  14. var user = new User();  
  15. user.username = "lisi";  
  16. user.say();//username:lisi  
  17.   
  18. var user1 = new User();  
  19. user1.say();//username:zhangsan,不受user对象的影响  


//多个实例对象不共享类的属性值: 
Java代码  收藏代码
  1. //多个实例对象不共享类的属性值,如下:  
  2. function User(){  
  3.     this.username = new Array();//this.不能丢  
  4.       
  5.     this.say = function(){//this.不能丢  
  6.         alert("username:" + this.username );//this.不能丢  
  7.     }  
  8. }  
  9.   
  10. var user = new User();  
  11. user.username.push("zhangsan");  
  12. user.say();//username:zhangsan  
  13.   
  14. var user1 = new User();  
  15. user1.say();//user1的username为空,不为zhangsan,因为user1的属性值不受user影响  


2.原型方式定义类,缺点:类的属性值如果是引用类型的(非Number和String类型),则多个实例对象共享 
Java代码  收藏代码
  1. //原型方式定义类,缺点:类的属性值如果是引用类型的(非Number和String类型),则多个实例对象共享  
  2. function User(){  
  3. }  
  4. User.prototype.username = "zhangsan";  
  5. User.prototype.say = function(){  
  6.     alert("username: " + this.username );  
  7. }  
  8.   
  9. var user = new User();  
  10. user.username = "lisi";  
  11. user.say();//username:lisi  
  12.   
  13. var user1 = new User();  
  14. user1.say();//username:zhangsan  


类的属性值如果是引用类型的(非Number和String类型),则多个实例对象共享: 
Java代码  收藏代码
  1. //类的属性值如果是引用类型的(非Number和String类型),则多个实例对象共享,如下  
  2. function User(){  
  3. }  
  4. User.prototype.username = new Array();  
  5. User.prototype.say = function(){  
  6.     alert("username: " + this.username );  
  7. }  
  8.   
  9. var user = new User();  
  10. user.username.push("zhangsan") ;  
  11. user.say();//username:zhangsan  
  12.   
  13. var user1 = new User();  
  14. user1.say();//username:zhangsan,因为user1属性也会受到user的影响,user1和user指向同一引用,即共享同一属性  


3.构造和原型结合方式创建类:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。 

Java代码  收藏代码
  1. //构造和原型结合方式创建类:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。  
  2. function User(){  
  3.     this.username = "zhangsan";  
  4. }  
  5. User.prototype.say = function(){  
  6.     alert("username: " + this.username );  
  7. }  
  8. var user = new User();  
  9. alert(user.username);  


4.动态的原型方式:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的 

Java代码  收藏代码
  1. ////动态的原型方式:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的  
  2.   
  3. function User(){  
  4.     this.username = "zhangsan";  
  5.       
  6.     if(typeof User.flag == "undefined"){  
  7.         alert("execute...");  
  8.         User.prototype.say = function(){  
  9.             alert("username: " + this.username );  
  10.         }  
  11.           
  12.         User.flag = true;  
  13.     }  
  14. }  
  15.   
  16. var user1 = new User();//execute...  
  17. var user2 = new User();//不会打印出execute...,则说明方法只创建了一次,即方法只会产生一个  
  18. user1.say();//username  


总结: 
构造方式定义类:缺点:类里的方法,每个实例对象都会产生一个,导致产生大量方法;优点:所有实例对象都单独拥有一份类里的属性,即属性不共享 
原型方法定义类:缺点:所有实例对象都共同拥有一份类里的属性,即属性共享。优点:类的方法只会产生一个,不会产生大量方法 
构造和原型结合方式创建类:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。 

动态的原型方式:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的

js类的方法和原型方法的区别:类方法调用必须用类名调用,原型定义的方法只能通过对象来调用。最重要的是类方法只能调用类属性,无法和某个具体对象产生关系,而通过原型定义的方法可以操作某个对象实例的属性:优点是两者内存中均只有一份

原创粉丝点击