天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

JavaScript 私有成員分析

對象
JavaScript操作都是關于對象的。數組(Array)是對象,函數(Function)是對象。Object(類型)是對象。那么什么是對象呢?對象就是“名稱-值”對(name-value)。名稱是字符串,值可以是字符串、數值、布爾值或對象(包括數組和函數)。對象經常用哈希表實現,所以取值速度很快。
如果對象的一個值是函數(function),我們可以認為它是成員函數,當成員函數被調用時,this變量就會指向該對象。成員函數可以通過this變量訪問對象的成員。
對象可以通過構造器(constructor)生成,構造器是個初始化對象的函數。構造器在這里扮演了其他語言中“類”扮演的角色,也提供了定義static變量和方法的手段。
Public成員
對象的所有成員都是公開成員,誰都可以讀寫甚至刪除這些成員或添加新成員。添加新成員有兩種方法:
在構造器里添加
這通常被用來初始化公開的成員變量。利用構造器的this變量來把成員添加到對象里。
function Container(param)
{ this.member = param;}
用下面這行代碼生成一個對象實例
var myContainer = new Container('abc');
myContainer的member成員值為'abc'。
在原型中添加
這種方法經常用來添加公開成員函數。當Javascrīpt解釋器遇到一個對象的成員,發現對象自身中并不存在這個成員時,就會到對象構造函數 的原型中去找。原型機制可以用來實現繼承。它同樣占用內存。如果想要給某個構造函數生成的所有對象都添加一個方 法,只要給對象的原型添加這個方法就可以了。
Container.prototype.stamp = function (string) { return this.member + string;}
這樣就可以調用這個成員函數
myContainer.stamp('def')
返回值'abcdef'。
私有成員
私有成員是在構造器里產生的。var定義的變量和構造器的參數會成為私有成員。
function Container(param){
this.member = param;
var secret = 3;
var that = this;
}
這個構造器定義了三個私有變量:param,secret和self。它們屬性對象Container,而對象外的代碼或是對象的公開方法都無法訪問它們。
只有私有方法可以訪問。私有方法是構造器內定義的函數。
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 檢查實例變量 secret 的值,如果它大于0就減少它的值然后返回true;否則它返回false。
它可以用于限制這個對象只能被使用3次。
根據協議,我們定義了一個私有變量that,用來讓私有方法可以訪問對象本身。
這是一個變通的解決方案,需要它的根本原因在于ECMAscrīpt語言規范的一個錯誤,而這個錯誤導致內部函數的this變量有
錯誤。(honker:似乎不用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;
this.service = function () {
if (dec()) {
return that.member;
} else {
return null;
} };}
service是一個特權方法。前三次調用myContainer.service()將返回'abc',之后它將返回null。service調用私有的dec方法,dec方法訪問私有的secret變量。service對其他對象和函數都是可見的,但我們不能直接訪問private成員。
閉包
因為有了閉包的我,這些公開、私有和特權方法的寫法才成為可能。它意味著內部函數總能訪問它外層函數定義的變量和參數。即使外層函數已經返回。這是Javascrīpt的一個極其強大的特性。目前還沒有如何一本Javascrīpt編程的書講到如何利用它,大多都沒有提到它。
私有和特權成員只能在對象被構造時生成。公開成員可以在任何時間添加。
寫法
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 (...) {...};
}

JavaScript技術JavaScript 私有成員分析,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 啪啪啪社区 | 久久午夜夜伦鲁鲁片无码免费 | 国产亚洲精品久久久久久国模美 | 九九99亚洲精品久久久久 | 与邻居换娶妻子2在线观看 瑜伽牲交AV | 日本超A大片在线观看 | 涩涩视频www在线观看入口 | 成年人视频在线免费看 | 亚洲AV精品无码喷水直播间 | 牛牛自拍国产免费视频 | 日本熟妇乱妇熟色A片蜜桃亚洲 | 被高跟鞋调教丨vk | 日日摸夜夜嗷嗷叫日日拍 | 在线一本码道高清 | 中文字幕无码亚洲视频 | 欧美另类老女人 | 欧美阿v在线天堂 | 久久影院毛片一区二区 | 先锋影音av无码第1页 | 俄罗斯搜索引擎Yandex推广入口 | 国产亚洲精品a在线观看app | 国产精品美女久久久久浪潮AV | 一级做a爰片久久毛片潮喷动漫 | 国产这里有精品 | 暖暖视频中国在线观看免费韩国 | 成人无码在线视频区 | 人人爽久久久噜噜噜丁香AV | 国产扒开美女双腿屁股流白浆 | 人与禽物videos另类 | 老师的快感电影完整版 | 粉嫩极品国产在线观看 | 丰满少妇被猛烈进出69影院 | 韩国电影real在线观看完整版 | 亚洲va在线va天堂XX xX | 疯狂小护士 | 夜色私人影院永久入口 | 2019伊人查蕉在线观看 | 一二三四电影完整版免费观看 | 美女被强奷到抽搐的动态图 | 久久99免费视频 | 国产午夜精品久久久久九九 |