JAVASCRIPT定义对象的四种方式

先写一个函数,下面几个方式会用到 
Javascript代码
  1. function showSalary(){  
  2.     alert(this.salary);  
  3. }  



工厂方式 
先创建对象,然后添加属性和方法,不需要用NEW创建对象, 
如果把函数写在内部,每次调用都会创建新的函数,放在外面,封装性不好 

Javascript代码
  1. function createWorker(sAage,sSalary,sDepartment){  
  2.   
  3.   var oWorker=new Object();  
  4.     
  5.   oWorker.age=sAage;  
  6.     
  7.   oWorker.salary=sSalary;  
  8.     
  9.   oWorker.department=sDepartment;  
  10. //创建函数的方式一,指向我们文章开头写好的函数名,缺点是函数在对象的外部,封装性不好  
  11.   oWorker.tellSalary=showSalary;  
  12. //创建函数的方式二,在对象内部声明匿名函数,虽然封装在对象内部了,但没个对象会有不同的函数版本,浪费内存  
  13.   oWorker.tellSalary=function(){  
  14.     alert(this.salary);  
  15.   }  
  16.     
  17.   return oWorker;  
  18. }  
  19.   
  20. var worker1=createWorker(24,1000,"Dev");  
  21. worker1.tellSalary();  
  22.   
  23. var worker2=createWorker(24,3000,"Dev");  
  24. worker2.tellSalary();  


构造函数方式 
在构造函数内部不创建对象,使用this关键字,创建时候用new操作符,如果把函数声明在内部,存在和工厂方式相同的问题,重复创建函数。为每个对象都创建独立的函数版本。放在外部,封装性不好 

Javascript代码
  1. function Worker(sAage,sSalary,sDepartment){  
  2.       
  3.   this.age=sAage;  
  4.     
  5.   this.salary=sSalary;  
  6.     
  7.   this.department=sDepartment;  
  8.     
  9.   //同工厂方式  
  10.   this.tellSalary=showSalary;  
  11.   //同工厂方式  
  12.   this.tellSalary=function(){  
  13.     alert(this.salary);  
  14.   }  
  15.   
  16. }  
  17.   
  18. var worker3=new Worker(24,1000,"Dev");  
  19. worker3.tellSalary();  
  20.   
  21. var worker4=new Worker(24,3000,"Dev");  
  22. worker4.tellSalary();  


原型方式,创建对象时不能使用构造传递参数,必须先创建对象,然后改变属性的值 

Javascript代码 
  1. function Worker(){  
  2. }  
  3.   
  4.   
  5. Worker.prototype.age=24;  
  6.   
  7. Worker.prototype.salary=1000;  
  8.   
  9. Worker.prototype.department="Dev";  
  10.   
  11. Worker.prototype.homeaddress=new Array("www","dd");  
  12.   
  13. // 创建多个对象时,要想一想此处为什么不会和构造函数方式及工厂方式一样,创建多个函数的实例  
  14.   
  15. //要理解prototype的概念,prototype是父对象的一个实例  
  16.   
  17. Worker.prototype.tellSalary=function(){  
  18.     alert(this.age);  
  19. }  
  20.   
  21. var worker5=new Worker();  
  22.   
  23. var worker6=new Worker();  
  24.   
  25. worker5.tellSalary();  
  26.   
  27. alert(worker5.homeaddress)  
  28.   
  29. //修改原型中引用类型的值,会影响到所有已经实例化的对象  
  30. worker6.homeaddress.push("gg")   
  31.   
  32. alert(worker5.homeaddress)  


混合原型和构造函数方式 
可以传递参数构造对象,多个实例对象共享一个函数 

Javascript代码
  1. function Worker(sAage,sSalary,sDepartment){  
  2.       
  3.   this.age=sAage;  
  4.     
  5.   this.salary=sSalary;  
  6.     
  7.   this.department=sDepartment;  
  8.     
  9.   this.homeaddress=new Array("www","dd");  
  10.     
  11. }  
  12.   
  13. //只创建tellSalary函数一个实例,没有内存浪费  
  14. Worker.prototype.tellSalary=function(){  
  15.     alert(this.age);  
  16. }  
  17.   
  18. var worker7=new Worker(23,3000,"Dev");  
  19.   
  20. var worker8=new Worker(43,1000,"Dev");  
  21.   
  22. worker7.tellSalary();  
  23.   
  24. alert(worker7.homeaddress) // ww dd  
  25.   
  26. worker8.homeaddress.push("gg")  
  27.   
  28. alert(worker7.homeaddress) //www dd  
  29.   
  30. alert(worker8.homeaddress) // www dd gg  


第四种的方式看上去也很散落,可以改进一下 
Javascript代码 
  1. var person=function(sname,sage){  
  2.    this.name=sname;  
  3.    this.age=sage;  
  4. };  
  5.   
  6. person.prototype={  
  7.    tellName:function(){  
  8.          alert(this.name);  
  9.    },  
  10.      
  11.    tellAge:function(){  
  12.          alert(this.age);  
  13.    }  
  14. };  

优点: 
  1. 可以传参数构造一个新对象 
  2. 当有多个对象产生时,不会创建多个函数实体,没有内存浪费 
  3. 封装想很好,属性和方法分开, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值