javascript---类的构建

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对象的影响  
//构造方式定义类,优点:多个实例对象不共享类的属性值,缺点:每个实例对象都会产生出一个函数say
function User(){
	this.username = "zhangsan";//this.不能丢
	
	this.say = function(){//this.不能丢
		alert("username:" + this.username );//this.不能丢
	}
	//下面注释的这种写法不对
//	function say(){
//		alert("username:" + this.username );
//	}
}

var user = new User();
user.username = "lisi";
user.say();//username:lisi

var user1 = new User();
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影响  
//多个实例对象不共享类的属性值,如下:
function User(){
	this.username = new Array();//this.不能丢
	
	this.say = function(){//this.不能丢
		alert("username:" + this.username );//this.不能丢
	}
}

var user = new User();
user.username.push("zhangsan");
user.say();//username:zhangsan

var user1 = new User();
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类型),则多个实例对象共享
function User(){
}
User.prototype.username = "zhangsan";
User.prototype.say = function(){
	alert("username: " + this.username );
}

var user = new User();
user.username = "lisi";
user.say();//username:lisi

var user1 = new User();
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指向同一引用,即共享同一属性  
//类的属性值如果是引用类型的(非Number和String类型),则多个实例对象共享,如下
function User(){
}
User.prototype.username = new Array();
User.prototype.say = function(){
	alert("username: " + this.username );
}

var user = new User();
user.username.push("zhangsan") ;
user.say();//username:zhangsan

var user1 = new User();
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);  
//构造和原型结合方式创建类:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。
function User(){
	this.username = "zhangsan";
}
User.prototype.say = function(){
	alert("username: " + this.username );
}
var user = new User();
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  
动态的原型方式:优点:类的方法只会产生一个,不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的

function User(){
	this.username = "zhangsan";
	
	if(typeof User.flag == "undefined"){
		alert("execute...");
		User.prototype.say = function(){
			alert("username: " + this.username );
		}
		
		User.flag = true;
	}
}

var user1 = new User();//execute...
var user2 = new User();//不会打印出execute...,则说明方法只创建了一次,即方法只会产生一个
user1.say();//username



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值