亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript的public、private和privileged模式

 更新時(shí)間:2009年12月28日 23:34:05   作者:  
公共/私有變量和方法通過一個(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ù)的特性。
例:
復(fù)制代碼 代碼如下:

<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)镴avaScript對(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代碼
復(fù)制代碼 代碼如下:

functin Container(param) {
this.member = param;
}
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代碼
復(fù)制代碼 代碼如下:

Container.prototype.stamp = function (string) {
return this.member + string;
}
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代碼
復(fù)制代碼 代碼如下:

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

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

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實(shí)例變量。如果它大于0,則減少secret并返回true,否則返回false。它可以用來讓這個(gè)對(duì)象限制用3次。
按照慣例,我們定義一個(gè)private的that變量。這用來讓private方法可以使用本對(duì)象。這樣做是因?yàn)镋CMAScript語言規(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代碼
復(fù)制代碼 代碼如下:

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方法。前三次調(diào)用myContainer.service()將返回'abc'。之后,它將返回null。service調(diào)用private的dec方法,
dec方法訪問private的secret變量。service對(duì)其他對(duì)象和方法可見,但是它不允許直接訪問private變量。
閉包
由于JavaScript有閉包,public,private和privileged成員的模式是可行的。這意味著一個(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代碼
復(fù)制代碼 代碼如下:

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

Private
Java代碼
復(fù)制代碼 代碼如下:

function Constructor(...) {
var that = this;
var membername = value;
function membername(...) {...}
}
// 注意: function語句
// function membername(...) {...}
// 是如下代碼的簡(jiǎn)寫
// 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代碼
復(fù)制代碼 代碼如下:

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

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

相關(guān)文章

最新評(píng)論