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

JavaScript 私有成員分析

 更新時(shí)間:2009年01月13日 23:22:50   作者:  
JavaScript是世界上最受誤解的語(yǔ)言。有人認(rèn)為它缺少信息隱藏的屬性(封裝),因?yàn)镴avaScript對(duì)象不能擁有私有變量和函數(shù)。但這是誤解。JavaScript對(duì)象可以有私有成員。下面進(jìn)行說(shuō)明。

對(duì)象
JavaScript操作都是關(guān)于對(duì)象的。數(shù)組(Array)是對(duì)象,函數(shù)(Function)是對(duì)象。Object(類(lèi)型)是對(duì)象。那么什么是對(duì)象呢?對(duì)象就是“名稱(chēng)-值”對(duì)(name-value)。名稱(chēng)是字符串,值可以是字符串、數(shù)值、布爾值或?qū)ο螅ò〝?shù)組和函數(shù))。對(duì)象經(jīng)常用哈希表實(shí)現(xiàn),所以取值速度很快。
如果對(duì)象的一個(gè)值是函數(shù)(function),我們可以認(rèn)為它是成員函數(shù),當(dāng)成員函數(shù)被調(diào)用時(shí),this變量就會(huì)指向該對(duì)象。成員函數(shù)可以通過(guò)this變量訪問(wèn)對(duì)象的成員。
對(duì)象可以通過(guò)構(gòu)造器(constructor)生成,構(gòu)造器是個(gè)初始化對(duì)象的函數(shù)。構(gòu)造器在這里扮演了其他語(yǔ)言中“類(lèi)”扮演的角色,也提供了定義static變量和方法的手段。
Public成員
對(duì)象的所有成員都是公開(kāi)成員,誰(shuí)都可以讀寫(xiě)甚至刪除這些成員或添加新成員。添加新成員有兩種方法:
在構(gòu)造器里添加
這通常被用來(lái)初始化公開(kāi)的成員變量。利用構(gòu)造器的this變量來(lái)把成員添加到對(duì)象里。
function Container(param)
{ this.member = param;}
用下面這行代碼生成一個(gè)對(duì)象實(shí)例
var myContainer = new Container('abc');
myContainer的member成員值為'abc'。
在原型中添加
這種方法經(jīng)常用來(lái)添加公開(kāi)成員函數(shù)。當(dāng)Javascrīpt解釋器遇到一個(gè)對(duì)象的成員,發(fā)現(xiàn)對(duì)象自身中并不存在這個(gè)成員時(shí),就會(huì)到對(duì)象構(gòu)造函數(shù) 的原型中去找。原型機(jī)制可以用來(lái)實(shí)現(xiàn)繼承。它同樣占用內(nèi)存。如果想要給某個(gè)構(gòu)造函數(shù)生成的所有對(duì)象都添加一個(gè)方 法,只要給對(duì)象的原型添加這個(gè)方法就可以了。
Container.prototype.stamp = function (string) { return this.member + string;}
這樣就可以調(diào)用這個(gè)成員函數(shù)
myContainer.stamp('def')
返回值'abcdef'。
私有成員
私有成員是在構(gòu)造器里產(chǎn)生的。var定義的變量和構(gòu)造器的參數(shù)會(huì)成為私有成員。
function Container(param){
this.member = param;
var secret = 3;
var that = this;
}
這個(gè)構(gòu)造器定義了三個(gè)私有變量:param,secret和self。它們屬性對(duì)象Container,而對(duì)象外的代碼或是對(duì)象的公開(kāi)方法都無(wú)法訪問(wèn)它們。
只有私有方法可以訪問(wèn)。私有方法是構(gòu)造器內(nèi)定義的函數(shù)。
function Container(param){
function dec() {
if (secret > 0)
{ secret -= 1; return true; }
else {
return false;
} }
this.member = param;
var secret = 3;
var that = this;}
私有方法 dec 檢查實(shí)例變量 secret 的值,如果它大于0就減少它的值然后返回true;否則它返回false。
它可以用于限制這個(gè)對(duì)象只能被使用3次。
根據(jù)協(xié)議,我們定義了一個(gè)私有變量that,用來(lái)讓私有方法可以訪問(wèn)對(duì)象本身。
這是一個(gè)變通的解決方案,需要它的根本原因在于ECMAscrīpt語(yǔ)言規(guī)范的一個(gè)錯(cuò)誤,而這個(gè)錯(cuò)誤導(dǎo)致內(nèi)部函數(shù)的this變量有
錯(cuò)誤。(honker:似乎不用that也沒(méi)關(guān)系,也許是原文寫(xiě)得太早了,哪位高人遇到過(guò)這種問(wèn)題?)
私有方法不能被公開(kāi)方法調(diào)用。為了讓私有函數(shù)有用,我們需要引入特權(quán)方法的概念。
特權(quán)
特權(quán)方法可以訪問(wèn)私有變量和方法,并且它本身可以被公開(kāi)方法和外部訪問(wèn)??梢詣h除或替換一個(gè)特權(quán)方法但是不能改變它或強(qiáng)迫它放棄自己的秘密。
特權(quán)方法是在構(gòu)造函數(shù)通過(guò)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;
this.service = function () {
if (dec()) {
return that.member;
} else {
return null;
} };}
service是一個(gè)特權(quán)方法。前三次調(diào)用myContainer.service()將返回'abc',之后它將返回null。service調(diào)用私有的dec方法,dec方法訪問(wèn)私有的secret變量。service對(duì)其他對(duì)象和函數(shù)都是可見(jiàn)的,但我們不能直接訪問(wèn)private成員。
閉包
因?yàn)橛辛碎]包的我,這些公開(kāi)、私有和特權(quán)方法的寫(xiě)法才成為可能。它意味著內(nèi)部函數(shù)總能訪問(wèn)它外層函數(shù)定義的變量和參數(shù)。即使外層函數(shù)已經(jīng)返回。這是Javascrīpt的一個(gè)極其強(qiáng)大的特性。目前還沒(méi)有如何一本Javascrīpt編程的書(shū)講到如何利用它,大多都沒(méi)有提到它。
私有和特權(quán)成員只能在對(duì)象被構(gòu)造時(shí)生成。公開(kāi)成員可以在任何時(shí)間添加。
寫(xiě)法
Public
function Constructor(...) {
this.membername = value;
}
Constructor.prototype.membername = value;
Private
function Constructor(...) {
var that = this;
var membername = value;
function membername(...) {...}
}
Note: The function statement
function membername(...) {...}
is shorthand for
var membername = function membername(...) {...};
Privileged
function Constructor(...) {
this.membername = function (...) {...};
}

相關(guān)文章

  • JavaScript中的事件循環(huán)機(jī)制及其運(yùn)行原理

    JavaScript中的事件循環(huán)機(jī)制及其運(yùn)行原理

    JavaScript中的事件循環(huán)機(jī)制是一種異步處理機(jī)制,通過(guò)維護(hù)事件隊(duì)列和消息隊(duì)列,實(shí)現(xiàn)任務(wù)的分發(fā)和執(zhí)行。事件循環(huán)機(jī)制由主線程和任務(wù)隊(duì)列構(gòu)成,主線程運(yùn)行完當(dāng)前任務(wù)后會(huì)檢查任務(wù)隊(duì)列中是否有待執(zhí)行的任務(wù),如有則執(zhí)行,否則等待
    2023-04-04
  • JavaScript this關(guān)鍵字的深入詳解

    JavaScript this關(guān)鍵字的深入詳解

    這篇文章主要給大家介紹了關(guān)于JavaScript this關(guān)鍵字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • AlertBox 彈出層信息提示框效果實(shí)現(xiàn)步驟

    AlertBox 彈出層信息提示框效果實(shí)現(xiàn)步驟

    彈出層就是相對(duì)文檔或窗口定位的一個(gè)層,一般用來(lái)顯示提示信息、廣告等內(nèi)容,還可以配合覆蓋層來(lái)鎖定頁(yè)面。
    2010-10-10
  • JavaScript中將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)的技巧

    JavaScript中將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)的技巧

    在JavaScript中,parseFloat是一個(gè)內(nèi)置函數(shù),用于將一個(gè)字符串解析成浮點(diǎn)數(shù),這個(gè)方法對(duì)于處理用戶(hù)輸入、從文本文件讀取數(shù)據(jù)或者在Web API中獲取數(shù)值尤其重要,本文將詳細(xì)介紹parseFloat的工作原理、使用方法以及通過(guò)代碼案例展示其在實(shí)際開(kāi)發(fā)中的應(yīng)用
    2025-02-02
  • js面向?qū)ο蠓庋b級(jí)聯(lián)下拉菜單列表的實(shí)現(xiàn)步驟

    js面向?qū)ο蠓庋b級(jí)聯(lián)下拉菜單列表的實(shí)現(xiàn)步驟

    這篇文章主要介紹了js面向?qū)ο蠓庋b級(jí)聯(lián)下拉菜單列表的實(shí)現(xiàn)步驟,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下
    2021-02-02
  • js對(duì)象繼承之原型鏈繼承實(shí)例

    js對(duì)象繼承之原型鏈繼承實(shí)例

    這篇文章主要介紹了js對(duì)象繼承之原型鏈繼承,以實(shí)例形式分析了原型鏈繼承的實(shí)現(xiàn)方法與注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • JavaScript實(shí)現(xiàn)獲取img的原始尺寸的方法詳解

    JavaScript實(shí)現(xiàn)獲取img的原始尺寸的方法詳解

    在微信小程序開(kāi)發(fā)時(shí),它的image標(biāo)簽有一個(gè)默認(rèn)高度,這樣你的圖片很可能出現(xiàn)被壓縮變形的情況,所以就需要獲取到圖片的原始尺寸對(duì)image的寬高設(shè)置,本文就來(lái)分享一下JavaScript實(shí)現(xiàn)獲取img的原始尺寸的方法吧
    2023-03-03
  • 微信小程序?qū)崿F(xiàn)上傳圖片功能

    微信小程序?qū)崿F(xiàn)上傳圖片功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)上傳圖片功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • js中獲取URL參數(shù)的共用方法getRequest()方法實(shí)例詳解

    js中獲取URL參數(shù)的共用方法getRequest()方法實(shí)例詳解

    本文通過(guò)實(shí)例代碼給大家介紹了js中獲取URL參數(shù)的共用方法getRequest()方法 ,文末給大家提到了js獲取url參數(shù)值的兩種方式,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • JavaScript實(shí)現(xiàn)簡(jiǎn)單進(jìn)度條效果

    JavaScript實(shí)現(xiàn)簡(jiǎn)單進(jìn)度條效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)單進(jìn)度條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評(píng)論

余干县| 广元市| 东乌| 普定县| 旅游| 漳浦县| 宜昌市| 荔浦县| 开远市| 离岛区| 拜城县| 曲麻莱县| 澜沧| 宣武区| 庆阳市| 贵州省| 措美县| 车致| 施秉县| 安龙县| 开原市| 怀安县| 甘肃省| 博白县| 永春县| 通道| 鲁甸县| 池州市| 平谷区| 商水县| 沙河市| 茂名市| 靖州| 龙泉市| 泽普县| 建阳市| 宜章县| 罗源县| 景泰县| 郸城县| 四川省|