`

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
    分享到:
    评论

相关推荐

    JavaScript对象继承模型Fiber.js.zip

    Fiber.js 是来自 Linkedin 的一个轻量级的 JavaScript 对象继承模型。示例代码:// Animal base class var Animal = Fiber.extend(function() {  return {  // The `init` method serves as the ...

    EXT简体中文参考手册(PDF&CHM电子档)

    公开Public、私有Private、特权的Privileged? 19 重写公共变量 21 重写(Overriding)公共函数 21 DomQuery基础 22 DomQuery基础 22 扩展EXT组件 29 文件的创建 30 Let's go 33 完成 35 EXT的布局(Layout) 37 ...

    ext学习文档

    - **公开Public、私有Private、特权的Privileged?**: 解释了EXT中变量和方法的访问控制。 #### 6. DomQuery基础 DomQuery是EXT中的一个实用工具,用于简化DOM查询和操作。它提供了类似jQuery的语法来选择和操作...

    JS闭包原理与应用经典示例

    // Public, non-privileged methods. Book.prototype = { display: function() { /* ... */ } }; ``` 在实际开发中,合理使用闭包可以提高代码模块化程度、封装私有数据和方法,但也要注意闭包带来的内存和性能...

    EXT 中文手册

    - **权限管理**:EXT支持对组件的权限进行管理,包括公共(Public)、私有(Private)、特权(Privileged)等权限级别。 #### 十、DomQuery基础 - **DomQuery**:是EXT中用于操作DOM的一个强大工具。 - **功能**:支持...

    EXT 中文帮助手册

    16 applayout.html 16&lt;br&gt;applayout.js 17&lt;br&gt;公开Public、私有Private、特权的Privileged? 19 重写公共变量 21 重写(Overriding)公共函数 21 DomQuery基础 22 DomQuery基础 22 扩展EXT组件 ...

    EXTJS 中文手册 电子书

    公开Public、私有Private、特权的Privileged?................................................. 21 重写公共变量...............................................................................................

    php.ini-development

    ;;;;;;;;... 1.... 2.... 3.... 4.... 5.... 6.... The syntax of the file is extremely simple.... Section headers (e.g.... at runtime.... There is no name validation.... (e.g.... previously set variable or directive (e.g....

Global site tag (gtag.js) - Google Analytics