私有Private成員要由建構器產生。這個建構器有三個私有實例變數:param, secret, 和 self。它們被附加到了物件上,但它們無法從外部訪問,同時它們也無法被這個物件的公共方法所存取。他們只對私有成員可見。
本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。
JavaScript 是世界上最被誤解的語言。很多人認為它缺乏資訊隱藏的特性所以物件不能有私有實例變數和方法。但這是一個誤解。 JavaScript物件同樣可以擁有私有變數。下面就來講解一下:
JavaScript根本上都是關於的物件(Object)的。數組(Array)是對象,函數(Function)是對象,Object就不說了。那什麼是對象?物件是名稱-值的配對的集合。名稱是字串,值可以是字串、數字、布林值和物件(包括陣列和函數)。物件常常實作為哈希表以快速存取值。
如果一個值是函數,我們可以將它視為方法method。當呼叫物件的方法時,this 變數就會被設為該物件。這個方法就可以透過this變數來存取實例變數。
物件是由建構器constructor產生的,它是初始化物件的函數。建構器提供了其它語言中類別提供的特性,包括靜態方法和變數。
物件的成員都是 public 公共成員。任何函數都可以存取、修改或刪除這些成員。有兩個主要的途徑加入新的物件成員:
這個技術一般用來初始化公共實例變數。建構器的this變數是用來為物件新增成員的。
function Container(param) { this.member = param; }
這樣,如果我們建構一個新的物件
var myContainer = new Container('abc');
那麼myContainer.member 就會包含'abc'。
這個技巧一般用來加入公共方法。當一個成員被檢索且沒有在物件中發現的時候,那麼它就會從物件建構器的 prototype 成員中去取得它。這個原型機制可用來實作繼承。它也保存記憶體。要為一個建構器產生的所有物件加入一個方法,將函數加入建構器的prototype 中:
Container.prototype.stamp = function (string) { return this.member + string; }
這樣,我們可以呼叫這個方法
myContainer.stamp('def')
它會回傳'abcdef'.
私有Private成員要由建構器產生。建構器中的普通的var變數和參數都成為私有成員。
function Container(param) { this.member = param; var secret = 3; var self = this; }
這個建構器有三個私人實例變數:param, secret, 和 self。它們被附加到了物件上,但它們無法從外部訪問,同時它們也無法被這個物件的公共方法所存取。他們只對私有成員可見。私有方法則是建構器內部的函數。
function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } this.member = param; var secret = 3; var self = this; }
私有方法 dec 檢查 secret 實例變數。如果它大於0,就減少secret 的大小並傳回 true 。否則它會傳回 false 。這個可以限制物件使用三次。
依照慣例,我們給一個私有的 self 參數。這個可以令物件對私有方法可見。這種做法是因為ECMAScript Language Specification中的一個錯誤,而這個錯誤讓 this 無法正確地對內部函數設定。
私有方法無法被公用方法呼叫。要令私有方法有用,我們需要引入一種特權方法。
一個特權A privileged 方法可以存取私有的變數和方法,同時它對公用網域可見。也可以刪除或取代一個特權方法,但不能改變它。
特權方法是用 this 在建構器中分配的。
function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } this.member = param; var secret = 3; var self = this; this.service = function () { if (dec()) { return self.member; } else { return null; } }; }
service 就是一個特權方法。前三次呼叫會回傳'abc'。之後 ,它會傳回 null。 service呼叫的私有的 dec 方法,而 dec又存取了私有的 secret變數。 service對其它的物件和方法是可見的,但不能直接存取私有成員。
這種公共、私有和特權成員的模式是可行的原因是由於JavaScript有 closure閉包。這個意味著一個內部的函數總是可以存取這個函數外部的變數和參數,甚至在外部的函數返回之後。這是這個語言的一個極其強大的特性。目前沒有哪本關於JavaScript程式設計的書展示如何發掘這個特性。大多數都沒有提到。
私有和特權成員只能在物件建構的時候產生。公共成員可以在任意時刻添加。
function Constructor(...) { this.membername = value; } Constructor.prototype.membername = value;
function Constructor(...) { var self = this; var membername = value; function membername(...) {...} }
注意,實際上函數語句
function membername(...) {...}
是以下語句的縮寫,兩者相同:
var membername = function membername(...) {...};
function Constructor(...) { this.membername = function (...) {...}; }
【推薦學習:javascript高級教學】
以上是Javascript中什麼是私有成員的詳細內容。更多資訊請關注PHP中文網其他相關文章!