五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > JavaScript的public、private和privileged模式

JavaScript的public、private和privileged模式

文章來源:365jz.com     點(diǎn)擊數(shù):377    更新時(shí)間:2009-12-30 23:58   參與評(píng)論

公共/私有變量和方法
通過一個(gè)簡(jiǎn)單的的例子,來展示如何使用JavaScript在類里面創(chuàng)建私有變量和方法
 
Summary

--------------------------------------------------------------------------------

私有變量 在對(duì)象內(nèi)部使用'var'關(guān)鍵字來聲明,而且它只能被私有函數(shù)和特權(quán)方法訪問。
私有函數(shù) 在對(duì)象的構(gòu)造函數(shù)里聲明(或者是通過var functionName=function(){...}來定義),它能被特權(quán)函數(shù)調(diào)用(包括對(duì)象的構(gòu)造函數(shù))和私有函數(shù)調(diào)用。
特權(quán)方法 通過this.methodName=function(){...}來聲明而且可能被對(duì)象外部的代碼調(diào)用。它可以使用:this.特權(quán)函數(shù)() 方式來調(diào)用特權(quán)函數(shù),使用 :私有函數(shù)()方式來調(diào)用私有函數(shù)。

公共屬性 通過this.variableName來定義而且在對(duì)象外部是可以讀寫的。不能被私有函數(shù)所調(diào)用。
公共方法 通過ClassName.prototype.methodName=function(){...}來定義而且可以從對(duì)象外部來調(diào)用。
原型屬性 通過ClassName.prototype.propertyName=someValue來定義。
靜態(tài)屬性 通過ClassName.propertyName=someValue來定義。
另外注意下這種寫法: var 函數(shù)名=function 函數(shù)名(){...} 這個(gè)函數(shù)被調(diào)用時(shí)具有特權(quán)函數(shù)和私有函數(shù)的特性。

 

例:

 

 

Js代碼
<html>  
<head>  
<title></title>  
<script type="text/javascript">  
function Container( param ) {  
 
 function dec(){  
      if ( secret > 0 ) {  
         secret -= 1;  
         setSecret( 7)  
         alert( secret );  
         return true;  
      }  
      else {  
      //  alert( "over"+this.member);  
         return false;  
      }  
   }  
 
  // this.dec = dec;  
   //this.dec = function dec (){...} different from above code.  
   function setSecret( num ){  
      secret = num;  
   }  
   this.member = param;  
   var secret = 3;  
   var self = this;  
   this.service = function () {  
      if (dec()) {  
         alert();  
      }  
      else {  
         return null;  
      }  
   }  
}  
 
//  ---------------------------------------  
 
function start(){  
   alert( "Start" )  
   var test = new Container( 'liuqi' );  
  // test.setSecret( 2 );  
   test.service();   
   test.service();   
   test.service();   
   test.service();   
  var test2 = new Container( 'liuqi' );  
  //test2.service();   
 // Container.dec();  
}  
</script>  
</head>  
<body>  
<div onclick="start()" style="color:blue">click me</div>  
</body>  
</html>

JavaScript是世界上最被誤解的編程語言。有人認(rèn)為它缺少信息隱藏的特性,因?yàn)?SPAN lang=EN-US>JavaScript對(duì)象不能擁有私有變量的方法。
但是這是個(gè)誤解。JavaScript對(duì)象可以擁有私有成員。


對(duì)象

JavaScript
從根本上就是關(guān)于對(duì)象的。數(shù)組是對(duì)象,方法是對(duì)象,Object也是對(duì)象。什么是對(duì)象?對(duì)象就是鍵值對(duì)的集合。鍵是字符串,

值可以是字符串,數(shù)字,布爾和對(duì)象(包括數(shù)組和方法)。對(duì)象通常被實(shí)現(xiàn)為Hashtable,這樣值就可以被快速獲取。


如果值是一個(gè)函數(shù),我可以稱其為方法。當(dāng)對(duì)象的方法被調(diào)用時(shí),“this”變量則被賦予該對(duì)象。方法可以通過“this”變量訪問實(shí)例

變量。


對(duì)象可以由初始化對(duì)象的方法 -- 構(gòu)造函數(shù)產(chǎn)生。構(gòu)造函數(shù)提供在其他編程語言中類提供的特性,包括靜態(tài)變量和方法。


Public
對(duì)象的成員都是public成員。任何對(duì)象都可以訪問,修改,刪除這些成員或添加新成員。主要有兩種方式來在一個(gè)新對(duì)象里放置成員
:

在構(gòu)造函數(shù)里

這種技術(shù)通常用來初始化public實(shí)例變量。構(gòu)造函數(shù)的“this”變量用來給對(duì)象添加成員。

Java代碼

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

functin Container(param) {

    this.member = param;

}


這樣,如果我們構(gòu)造一個(gè)新對(duì)象var myContainer = new Container('abc'),則myContainer.member'abc'。

prototype
這種技術(shù)通常用來添加public方法。當(dāng)尋找一個(gè)成員并且它不在對(duì)象本身里時(shí),則從對(duì)象的構(gòu)造函數(shù)的prototype成員里找。
prototype
機(jī)制用來做繼承。為了添加一個(gè)方法到構(gòu)造函數(shù)創(chuàng)建的所有對(duì)象里,只需添加到構(gòu)造函數(shù)的prototype:

Java代碼

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

Container.prototype.stamp = function (string) {

    return this.member + string;

}


這樣,我們可以調(diào)用該方法myContainer.stamp('def'),結(jié)果為'abcdef'。

Private
private
成員由構(gòu)造函數(shù)產(chǎn)生。普通的var變量和構(gòu)造函數(shù)的參數(shù)都稱為private成員。

Java代碼

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

function Container(param) {

    this.member = param;

    var secret = 3;

    var that = this;

}


該構(gòu)造函數(shù)創(chuàng)建了3個(gè)private實(shí)例變量: param,secretthat。它們被添加到對(duì)象中,但是不能被外部訪問,也不能被該對(duì)象自己的
public
方法訪問。它們只能由private方法訪問。private方法是構(gòu)造函數(shù)的內(nèi)部方法。

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. }  

function Container(param) {

    function dec() {

        if (secret > 0) {

             secret -= 1;

             return true;

        } else {

             return false;

        }

    }

    this.member = param;

    var secret = 3;

    var that = this;

}


private
方法dec檢查secret實(shí)例變量。如果它大于0,則減少secret并返回true,否則返回false。它可以用來讓這個(gè)對(duì)象限制用3次。
按照慣例,我們定義一個(gè)privatethat變量。這用來讓private方法可以使用本對(duì)象。這樣做是因?yàn)?SPAN lang=EN-US>ECMAScript
語言規(guī)范有一個(gè)錯(cuò)誤,
該錯(cuò)誤導(dǎo)致不能正確的設(shè)置this給內(nèi)部方法。

private
方法不能被public方法調(diào)用。為了讓private方法有用,我們需要引入privileged方法。

Privileged
privileged
方法可以訪問private變量和方法,并且它本身可以被public方法和外界訪問??梢詣h除或替代privileged方法,但是不能
更改它或強(qiáng)制它泄露自己的秘密。

privileged
方法在構(gòu)造函數(shù)里用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.         }   
  19.     };   
  20. }  

function Container(param) {

    function dec() {

        if (secret > 0) {

            secret -= 1;

            return true;

        } else {

            return false;

        }

    }

    this.member = param;

    var secret = 3;

    var that = this;

    this.service = function() {

        if (dec()) {

            return that.member;

        } else {

            return null;

        }

    };

}


service
privileged方法。前三次調(diào)用myContainer.service()將返回'abc'。之后,它將返回null。service調(diào)用privatedec方法,
dec
方法訪問privatesecret變量。service對(duì)其他對(duì)象和方法可見,但是它不允許直接訪問private變量。

閉包
由于JavaScript有閉包,public,privateprivileged成員的模式是可行的。這意味著一個(gè)內(nèi)部方法始終可以訪問它的外部方法的
var
變量和參數(shù),甚至在外部方法返回之后。這是JavaScript語言的一個(gè)非常強(qiáng)大的特性。當(dāng)前沒有展示如何發(fā)掘這種特性的JavaScript
編程書籍,大多數(shù)甚至都沒提到。

private
privileged成員只能在對(duì)象被構(gòu)造時(shí)產(chǎn)生。public成員則可以在任何時(shí)候添加。

模式

public

Java代碼

  1. function Constructor(...) {   
  2.     this.membername = value;   
  3. }   
  4. Constructor.prototype.membername = value;  

function Constructor(...) {

    this.membername = value;

}

Constructor.prototype.membername = value;



Private

Java代碼

  1. function Constructor(...) {   
  2.     var that = this;   
  3.     var membername = value;   
  4.     function membername(...) {...}   
  5. }   
  6. // 注意: function語句   
  7. // function membername(...) {...}   
  8. // 是如下代碼的簡(jiǎn)寫   
  9. // var membername = function membername(...) {...};  

function Constructor(...) {

    var that = this;

    var membername = value;

    function membername(...) {...}

}

// 注意: function語句

// function membername(...) {...}

// 是如下代碼的簡(jiǎn)寫

// var membername = function membername(...) {...};



Privileged

Java代碼

  1. function Constructor(...) {   
  2.     this.membername = function (...) {...};   
  3. }  

function Constructor(...) {

    this.membername = function (...) {...};

}



譯者注:我認(rèn)為可以簡(jiǎn)單的把privileged方法簡(jiǎn)單的看成是構(gòu)造函數(shù)里的public方法,因?yàn)?SPAN lang=EN-US>privileged方法可以被外界和public方法訪問,
而它自身又可以訪問private變量。

如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答!! 點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (377人查看0條評(píng)論)
請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)