当前位置: 代码迷 >> JavaScript >> JavaScript的public、private跟privileged模式
  详细解决方案

JavaScript的public、private跟privileged模式

热度:560   发布时间:2012-10-26 10:30:59.0
JavaScript的public、private和privileged模式

JavaScript的public、private和privileged模式

原文:Private Members in JavaScript??

本文从这里转载,所有版权归原作者所有

?

公共/私有变量和方法

通过一个简单的的例子,来展示如何使用JavaScript在类里面创建私有变量和方法
?
Summary

  • 私有变量?在对象内部使用'var'关键字来声明,而且它只能被私有函数和特权方法访问。
  • 私有函数?在对象的构造函数里声明(或者是通过var functionName=function(){...}来定义),它能被特权函数调用(包括对象的构造函数)和私有函数调用。
  • 特权方法?通过this.methodName=function(){...}来声明而且可能被对象外部的代码调用。它可以使用:this.特权函数() 方式来调用特权函数,使用 :私有函数()方式来调用私有函数。
  • 公共属性?通过this.variableName来定义而且在对象外部是可以读写的。不能被私有函数所调用。
  • 公共方法?通过ClassName.prototype.methodName=function(){...}来定义而且可以从对象外部来调用。
  • 原型属性?通过ClassName.prototype.propertyName=someValue来定义。
  • 静态属性?通过ClassName.propertyName=someValue来定义。

另外注意下这种写法: var 函数名=function 函数名(){...} 这个函数被调用时具有特权函数和私有函数的特性。

?

例:

?

?

Js代码
  1. <html> ??
  2. <head> ??
  3. <title></title> ??
  4. <script?type="text/javascript"> ??
  5. function?Container(?param?)?{ ??
  6. ??
  7. ?function?dec(){ ??
  8. ??????if?(?secret?>?0?)?{ ??
  9. ?????????secret?-=?1; ??
  10. ?????????setSecret(?7) ??
  11. ?????????alert(?secret?); ??
  12. ?????????return?true; ??
  13. ??????} ??
  14. ??????else?{ ??
  15. ??????//??alert(?"over"+this.member);???
  16. ?????????return?false; ??
  17. ??????} ??
  18. ???} ??
  19. ??
  20. ??//?this.dec?=?dec;???
  21. ???//this.dec?=?function?dec?(){...}?different?from?above?code.???
  22. ???function?setSecret(?num?){ ??
  23. ??????secret?=?num; ??
  24. ???} ??
  25. ???this.member?=?param; ??
  26. ???var?secret?=?3; ??
  27. ???var?self?=?this; ??
  28. ???this.service?=?function?()?{ ??
  29. ??????if?(dec())?{ ??
  30. ?????????alert(); ??
  31. ??????} ??
  32. ??????else?{ ??
  33. ?????????return?null; ??
  34. ??????} ??
  35. ???} ??
  36. } ??
  37. ??
  38. //??---------------------------------------???
  39. ??
  40. function?start(){ ??
  41. ???alert(?"Start"?) ??
  42. ???var?test?=?new?Container(?'liuqi'?); ??
  43. ??//?test.setSecret(?2?);???
  44. ???test.service();? ??
  45. ???test.service();? ??
  46. ???test.service();? ??
  47. ???test.service();? ??
  48. ??var?test2?=?new?Container(?'liuqi'?); ??
  49. ??//test2.service();????
  50. ?//?Container.dec();???
  51. } ??
  52. </script> ??
  53. </head> ??
  54. <body> ??
  55. <div?onclick="start()"?style="color:blue">click?me</div> ??
  56. </body> ??
  57. </html>??

??

JavaScript
是世界上最被误解的编程语言。有人认为它缺少信息隐藏的特性,因为JavaScript对象不能拥有私有变量的方法。?
但是这是个误解。JavaScript对象可以拥有私有成员。?

对象?
JavaScript
从根本上就是关于对象的。数组是对象,方法是对象,Object也是对象。什么是对象?对象就是键值对的集合。键是字符串,?
值可以是字符串,数字,布尔和对象(包括数组和方法)。对象通常被实现为Hashtable,这样值就可以被快速获取。?

如果值是一个函数,我可以称其为方法。当对象的方法被调用时,“this”变量则被赋予该对象。方法可以通过“this”变量访问实例?
变量。?

对象可以由初始化对象的方法?--?构造函数产生。构造函数提供在其他编程语言中类提供的特性,包括静态变量和方法。?

Public?
对象的成员都是public成员。任何对象都可以访问,修改,删除这些成员或添加新成员。主要有两种方式来在一个新对象里放置成员:

在构造函数里?
这种技术通常用来初始化public实例变量。构造函数的“this”变量用来给对象添加成员。

Java代码

  1. functin?Container(param)?{ ??
  2. ????this.member?=?param; ??
  3. }??

?

?

?


这样,如果我们构造一个新对象var myContainer = new Container('abc'),则myContainer.member'abc'?

prototype?
这种技术通常用来添加public方法。当寻找一个成员并且它不在对象本身里时,则从对象的构造函数的prototype成员里找。?
prototype
机制用来做继承。为了添加一个方法到构造函数创建的所有对象里,只需添加到构造函数的prototype:

Java代码

  1. Container.prototype.stamp?=?function?(string)?{ ??
  2. ????return?this.member?+?string; ??
  3. }??

?

?

?


这样,我们可以调用该方法myContainer.stamp('def'),结果为'abcdef'?

Private?
private
成员由构造函数产生。普通的var变量和构造函数的参数都称为private成员。

Java代码

  1. function?Container(param)?{ ??
  2. ????this.member?=?param; ??
  3. ????var?secret?=?3; ??
  4. ????var?that?=?this; ??
  5. }??

?

?

?

?

?


该构造函数创建了3private实例变量: paramsecretthat。它们被添加到对象中,但是不能被外部访问,也不能被该对象自己的
public
方法访问。它们只能由private方法访问。private方法是构造函数的内部方法。

Java代码

  1. function?Container(param)?{ ??
  2. ????function?dec()?{ ??
  3. ????????if?(secret?>?0)?{ ??
  4. ?????????????secret?-=?1; ??
  5. ?????????????return?true; ??
  6. ????????}?else?{ ??
  7. ?????????????return?false; ??
  8. ????????} ??
  9. ????} ??
  10. ????this.member?=?param; ??
  11. ????var?secret?=?3; ??
  12. ????var?that?=?this; ??
  13. }??

?

?

?

?

?

?

?

?

?

?

?

?

?


private
方法dec检查secret实例变量。如果它大于0,则减少secret并返回true,否则返回false。它可以用来让这个对象限制用3次。
按照惯例,我们定义一个privatethat变量。这用来让private方法可以使用本对象。这样做是因为ECMAScript语言规范有一个错误,?
该错误导致不能正确的设置this给内部方法。?

private
方法不能被public方法调用。为了让private方法有用,我们需要引入privileged方法。?

Privileged?
privileged
方法可以访问private变量和方法,并且它本身可以被public方法和外界访问。可以删除或替代privileged方法,但是不能
更改它或强制它泄露自己的秘密。?

privileged
方法在构造函数里用this分配。

Java代码

  1. function?Container(param)?{ ??
  2. ????function?dec()?{ ??
  3. ????????if?(secret?>?0)?{ ??
  4. ????????????secret?-=?1; ??
  5. ????????????return?true; ??
  6. ????????}?else?{ ??
  7. ????????????return?false; ??
  8. ????????} ??
  9. ????} ??
  10. ????this.member?=?param; ??
  11. ????var?secret?=?3; ??
  12. ????var?that?=?this; ??
  13. ????this.service?=?function()?{ ??
  14. ????????if?(dec())?{ ??
  15. ????????????return?that.member; ??
  16. ????????}?else?{ ??
  17. ????????????return?null; ??
  18. font-size: 13px; line-height: 19px; text-align: left; m
  相关解决方案