龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

没那么简单 那些应该吃透的JavaScript概念(1)(2)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
三,对象属性的封装(公有和私有) 以例子来说明: functionList(){ varm_elements =[];//私有成员,在对象外无法访问 m_elements = Array .apply(m_elements,arguments); //此处

三,对象属性的封装(公有和私有)

以例子来说明:

  1. functionList(){  
  2. varm_elements=[];//私有成员,在对象外无法访问  
  3. m_elements=Array.apply(m_elements,arguments);  
  4. //此处模拟getter,使用时alist.length;  
  5. //等价于getName()方式:this.length=function(){returnm_elements.length;},使用时alist.length();  
  6. //公有属性,可以通过"."运算符或下标来访问  
  7. this.length={  
  8. valueOf:function(){  
  9. returnm_elements.length;  
  10. },  
  11. toString:function(){  
  12. returnm_elements.length;  
  13. }  
  14. }  
  15. //公有方法,此方法使用得alert(alist)相当于alert(alist.toString())  
  16. this.toString=function(){  
  17. returnm_elements.toString();  
  18. }  
  19. //公有方法  
  20. this.add=function(){  
  21. m_elements.push.apply(m_elements,arguments);  
  22. }  
  23. //私有方法如下形式,这里涉及到了闭包的概念,接下来继续说明  
  24. //varadd=function()或functionadd()  
  25. //{  
  26. //m_elements.push.apply(m_elements,arguments);  
  27. //}  
  28. }  
  29. varalist=newList(1,2,3);  
  30. dwn(alist);//=alert(alist.toString()),输出1,2,3  
  31. dwn(alist.length);//输出3  
  32. alist.add(4,5,6);  
  33. dwn(alist);//输出1,2,3,4,5,6  
  34. dwn(alist.length);//输出6 

四,属性和方法的类型

JavaScript里,对象的属性和方法支持4种不同的类型:privateproperty(私有属性),dynamicpublicproperty(动态公有属性),staticpublicproperty/prototypeproperty(静态公有属性或原型属性),staticproperty(静态属性或类属性)。私有属性对外界完全不具备访问性,可以通过内部的getter和setter(都是模拟);动态公有属性外界可以访问,每个对象实例持有一个副本,不会相互影响;原型属性每个对象实例共享唯一副本;类属性不作为实例的属性,只作为类的属性。以下是例子:

  1. //动态公有类型,静态公有类型(原型属性)  
  2. functionmyClass(){  
  3. varp=100;//privateproperty  
  4. this.x=10;//dynamicpublicproperty  
  5. }  
  6. myClass.prototype.y=20;  
  7. //要想成为高级JavaScript阶段,prototype和闭包必须得理解和适当应用  
  8. myClass.z=30;//staticproperty  
  9.  
  10. vara=newmyClass();  
  11. dwn(a.p)//undefined  
  12. dwn(a.x)//10  
  13. dwn(a.y)//20  
  14. a.x=20;  
  15. a.y=40;  
  16. dwn(a.x);//20  
  17. dwn(a.y);//40  
  18. delete(a.x);//删除对象a的属性x  
  19. delete(a.y);//删除对象a的属性y  
  20. dwn(a.x);//undefined  
  21. dwn(a.y);//20静态公有属性y被删除后还原为原型属性y  
  22. dwn(a.z);//undefined类属性无法通过对象访问  
  23. dwn(myClass.z); 

五,原型(prototype)

这里只讲部分,prototype和闭包都不是几句话都能讲清楚的,如果这里可以给你一些启蒙,则万幸矣。习语”照猫画虎“,这里的猫就是原型,虎是类型,可以表示成:虎.prototype=某只猫or虎.prototype=new猫()。因为原型属性每个对象实例共享唯一副本,所以当实例中的一个调整了一个原型属性的值时,所有实例调用这个属性时都将发生变化,这点需要注意,以下是原型关系的类型链:

  1. functionClassA(){  
  2. }  
  3. ClassA.prototype=newObject();  
  4. functionClassB(){  
  5. }  
  6. ClassB.prototype=newClassA();  
  7. functionClassC(){  
  8. }  
  9. ClassC.prototype=newClassB();  
  10. varobj=newClassC();  
  11. dwn(objinstanceofClassC);//true  
  12. dwn(objinstanceofClassB);//true  
  13. dwn(objinstanceofClassA);//true  
  14. dwn(objinstanceofObject);//true  
  15. 带默认值的Point对象:  
  16. functionPoint2(x,y){  
  17. if(x)this.x=x;  
  18. if(y)this.y=y;  
  19. }  
  20. //设定Point2对象的x,y默认值为0  
  21. Point2.prototype.x=0;  
  22. Point2.prototype.y=0;  
  23. //p1是一个默认(0,0)的对象  
  24. varp1=newPoint2();//可以写成varp1=newPoint2也不会出错,WHY  
  25. //p2赋值  
  26. varp2=newPoint2(1,2);  
  27. dwn(p1.x+","+p1.y);//0,0  
  28. dwn(p2.x+","+p2.y);//1,2  
  29. delete对象的属性后,原型属性将回到初始化的状态:  
  30. functionClassD(){  
  31. this.a=100;  
  32. this.b=200;  
  33. this.c=300 
  34. }  
  35. ClassD.prototype=newClassD();//将ClassD原有的属性设为原型,包括其值  
  36. ClassD.prototype.reset=function(){//将非原型属性删除  
  37. for(vareachinthis){  
  38. deletethis[each];  
  39. }  
  40. }  
  41. vard=newClassD();  
  42. dwn(d.a);//100  
  43. d.a*=2;  
  44. d.b*=2;  
  45. d.c*=2;  
  46. dwn(d.a);//200  
  47. dwn(d.b);//400  
  48. dwn(d.c);//600  
  49. d.reset();//删掉非原型属性,所有回来原型  
  50. dwn(d.a);//100  
  51. dwn(d.b);//200  
  52. dwn(d.c);//300 

精彩图集

赞助商链接