最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript的public、private和privileged模式

 更新時間:2009年12月28日 23:34:05   作者:  
公共/私有變量和方法通過一個簡單的的例子,來展示如何使用JavaScript在類里面創(chuàng)建私有變量和方法
Summary
私有變量 在對象內部使用'var'關鍵字來聲明,而且它只能被私有函數(shù)和特權方法訪問。
私有函數(shù) 在對象的構造函數(shù)里聲明(或者是通過var functionName=function(){...}來定義),它能被特權函數(shù)調用(包括對象的構造函數(shù))和私有函數(shù)調用。
特權方法 通過this.methodName=function(){...}來聲明而且可能被對象外部的代碼調用。它可以使用:this.特權函數(shù)() 方式來調用特權函數(shù),使用 :私有函數(shù)()方式來調用私有函數(shù)。
公共屬性 通過this.variableName來定義而且在對象外部是可以讀寫的。不能被私有函數(shù)所調用。
公共方法 通過ClassName.prototype.methodName=function(){...}來定義而且可以從對象外部來調用。
原型屬性 通過ClassName.prototype.propertyName=someValue來定義。
靜態(tài)屬性 通過ClassName.propertyName=someValue來定義。
另外注意下這種寫法: var 函數(shù)名=function 函數(shù)名(){...} 這個函數(shù)被調用時具有特權函數(shù)和私有函數(shù)的特性。
例:
復制代碼 代碼如下:

<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是世界上最被誤解的編程語言。有人認為它缺少信息隱藏的特性,因為JavaScript對象不能擁有私有變量的方法。
但是這是個誤解。JavaScript對象可以擁有私有成員。
對象
JavaScript從根本上就是關于對象的。數(shù)組是對象,方法是對象,Object也是對象。什么是對象?對象就是鍵值對的集合。鍵是字符串,
值可以是字符串,數(shù)字,布爾和對象(包括數(shù)組和方法)。對象通常被實現(xiàn)為Hashtable,這樣值就可以被快速獲取。
如果值是一個函數(shù),我可以稱其為方法。當對象的方法被調用時,“this”變量則被賦予該對象。方法可以通過“this”變量訪問實例
變量。
對象可以由初始化對象的方法 -- 構造函數(shù)產(chǎn)生。構造函數(shù)提供在其他編程語言中類提供的特性,包括靜態(tài)變量和方法。
Public
對象的成員都是public成員。任何對象都可以訪問,修改,刪除這些成員或添加新成員。主要有兩種方式來在一個新對象里放置成員:
在構造函數(shù)里
這種技術通常用來初始化public實例變量。構造函數(shù)的“this”變量用來給對象添加成員。
Java代碼
復制代碼 代碼如下:

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

這樣,如果我們構造一個新對象var myContainer = new Container('abc'),則myContainer.member為'abc'。
在prototype里
這種技術通常用來添加public方法。當尋找一個成員并且它不在對象本身里時,則從對象的構造函數(shù)的prototype成員里找。
prototype機制用來做繼承。為了添加一個方法到構造函數(shù)創(chuàng)建的所有對象里,只需添加到構造函數(shù)的prototype:
Java代碼
復制代碼 代碼如下:

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

這樣,我們可以調用該方法myContainer.stamp('def'),結果為'abcdef'。
Private
private成員由構造函數(shù)產(chǎn)生。普通的var變量和構造函數(shù)的參數(shù)都稱為private成員。
Java代碼
復制代碼 代碼如下:

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

該構造函數(shù)創(chuàng)建了3個private實例變量: param,secret和that。它們被添加到對象中,但是不能被外部訪問,也不能被該對象自己的
public方法訪問。它們只能由private方法訪問。private方法是構造函數(shù)的內部方法。
Java代碼
復制代碼 代碼如下:

function Container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var that = this;
}
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實例變量。如果它大于0,則減少secret并返回true,否則返回false。它可以用來讓這個對象限制用3次。
按照慣例,我們定義一個private的that變量。這用來讓private方法可以使用本對象。這樣做是因為ECMAScript語言規(guī)范有一個錯誤,
該錯誤導致不能正確的設置this給內部方法。
private方法不能被public方法調用。為了讓private方法有用,我們需要引入privileged方法。
Privileged
privileged方法可以訪問private變量和方法,并且它本身可以被public方法和外界訪問??梢詣h除或替代privileged方法,但是不能
更改它或強制它泄露自己的秘密。
privileged方法在構造函數(shù)里用this分配。
Java代碼
復制代碼 代碼如下:

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;
}
};
}
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方法。前三次調用myContainer.service()將返回'abc'。之后,它將返回null。service調用private的dec方法,
dec方法訪問private的secret變量。service對其他對象和方法可見,但是它不允許直接訪問private變量。
閉包
由于JavaScript有閉包,public,private和privileged成員的模式是可行的。這意味著一個內部方法始終可以訪問它的外部方法的
var變量和參數(shù),甚至在外部方法返回之后。這是JavaScript語言的一個非常強大的特性。當前沒有展示如何發(fā)掘這種特性的JavaScript
編程書籍,大多數(shù)甚至都沒提到。
private和privileged成員只能在對象被構造時產(chǎn)生。public成員則可以在任何時候添加。
模式
public
Java代碼
復制代碼 代碼如下:

function Constructor(...) {
this.membername = value;
}
Constructor.prototype.membername = value;
function Constructor(...) {
this.membername = value;
}
Constructor.prototype.membername = value;

Private
Java代碼
復制代碼 代碼如下:

function Constructor(...) {
var that = this;
var membername = value;
function membername(...) {...}
}
// 注意: function語句
// function membername(...) {...}
// 是如下代碼的簡寫
// var membername = function membername(...) {...};
function Constructor(...) {
var that = this;
var membername = value;
function membername(...) {...}
}
// 注意: function語句
// function membername(...) {...}
// 是如下代碼的簡寫
// var membername = function membername(...) {...};

Privileged
Java代碼
復制代碼 代碼如下:

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

譯者注:我認為可以簡單的把privileged方法簡單的看成是構造函數(shù)里的public方法,因為privileged方法可以被外界和public方法訪問,
而它自身又可以訪問private變量。

相關文章

  • Safari5中alert的無限循環(huán)BUG

    Safari5中alert的無限循環(huán)BUG

    猜測Safari5中將點擊alert框的確定按鈕也當成點擊body了。事件一直冒泡到彈出框上。
    2011-04-04
  • 如何基于js判斷瀏覽器版本

    如何基于js判斷瀏覽器版本

    這篇文章主要介紹了如何基于js判斷瀏覽器版本,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 你必須了解的JavaScript中的屬性描述對象詳解(下)

    你必須了解的JavaScript中的屬性描述對象詳解(下)

    JavaScript提供了一個內部數(shù)據(jù)結構,用來描述對象的屬性,控制它的行為,比如該屬性是否可寫、可遍歷等等。這個內部數(shù)據(jù)結構稱為“屬性描述對象”。本文主要帶大家了解一下JavaScript中你必須了解的屬性描述對象,需要的可以參考一下
    2022-12-12
  • JavaScript獲得表單target屬性的方法

    JavaScript獲得表單target屬性的方法

    這篇文章主要介紹了JavaScript獲得表單target屬性的方法,涉及javascript操作表單屬性的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • JS實現(xiàn)彈性菜單效果代碼

    JS實現(xiàn)彈性菜單效果代碼

    這篇文章主要介紹了JS實現(xiàn)彈性菜單效果代碼,可實現(xiàn)鼠標滑過后背景色滑塊彈性滑過的效果,非常具有實用價值,需要的朋友可以參考下
    2015-09-09
  • JavaScript返回0-1之間隨機數(shù)的方法

    JavaScript返回0-1之間隨機數(shù)的方法

    這篇文章主要介紹了JavaScript返回0-1之間隨機數(shù)的方法,涉及javascript中Math對象random方法的使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • 基于JQuery+HTML+JavaScript實現(xiàn)地圖位置選取和地址模糊查詢

    基于JQuery+HTML+JavaScript實現(xiàn)地圖位置選取和地址模糊查詢

    本文詳細講解了如何使用 JQuery+HTML+JavaScript 實現(xiàn)移動端頁面中的地圖位置選取功能,本文逐步展示了如何構建基本的地圖頁面,如何通過點擊地圖獲取經(jīng)緯度和地理信息,以及如何實現(xiàn)模糊查詢地址并在地圖上標注,感興趣的小伙伴跟著小編一起來看看吧
    2024-07-07
  • 前端常見的兩種pc適配方案介紹

    前端常見的兩種pc適配方案介紹

    這篇文章主要介紹了前端常見的兩種pc適配方案的相關資料,在PC端自適應設計通過優(yōu)化用戶體驗和提高網(wǎng)站適配性,確保了電商網(wǎng)站、企業(yè)官網(wǎng)和在線教育平臺等多種場景下內容的清晰展示和流暢操作,需要的朋友可以參考下
    2024-10-10
  • JavaScript實現(xiàn)網(wǎng)站訪問次數(shù)統(tǒng)計代碼

    JavaScript實現(xiàn)網(wǎng)站訪問次數(shù)統(tǒng)計代碼

    每個網(wǎng)站管理者,都必須知道每天有多少人訪問了本站,需要一個網(wǎng)站訪問次數(shù)功能來滿足需求,本篇文章主要介紹了JavsScript實現(xiàn)網(wǎng)站訪問次數(shù)統(tǒng)計代碼,需要的朋友可以參考下
    2015-08-08
  • JavaScript?數(shù)組基本操作全解

    JavaScript?數(shù)組基本操作全解

    今天這篇文章就是來和大家詳細聊聊JavaScript中數(shù)組的基本操作,很多語言都是在數(shù)組這有個分水嶺。聽懂了接下來就很容易,聽不懂就難辦了,大家要認真看喲。希望大家讀完有所收獲,那我辛苦碼字也就值了
    2022-02-02

最新評論

弥渡县| 万全县| 门头沟区| 屯门区| 偃师市| 扶风县| 永康市| 新安县| 永嘉县| 克山县| 福建省| 巩义市| 河南省| 永康市| 承德市| 犍为县| 马龙县| 治多县| 靖边县| 阿坝县| 崇仁县| 汪清县| 新竹市| 天峨县| 什邡市| 抚松县| 和田县| 襄城县| 邢台市| 五华县| 杭锦旗| 柳州市| 佛学| 丹江口市| 霍林郭勒市| 云和县| 永仁县| 苗栗市| 嘉禾县| 平谷区| 洛阳市|