JavaScript是建立在物件之上的。陣列(Array)是對象,函數(Function)是對象,而對象(Objects)當然也是對象。那什麼是對象呢?物件是一組「名稱:值」對(name-value pair)的集合。名稱是字串,但值卻可以是字串、數值、布林或物件(包括陣列和函數)。物件通常是用哈希表來實現的,以便可以快速地取值。
如果值是函數,我們就可以把它當作一個「方法」。當物件的一個方法被執行,變數this就被設為物件本身。如此,方法就可以透過this變數來存取物件的實例。
物件可以透過「建構器(constructor)」來建立。構造器是一個擁有初始化物件的函數。構造器提供了類似其他語言中的「類別(class)」所提供的特性和功能,包括靜態變數和方法。
物件的所有成員都是公有成員。任何函數都可以存取、修改或刪除這些成員,當然也可以新增新的成員。將物件新增成員的兩種主要方法:
這種方法一般用來初始化物件實例的公有變數。建構器的this變數被用來為物件新增成員:
function Container(param) { this.member = param; }
建構一個新的物件:
var myContainer = new Container('abc');
然後,公有變數 myContainer.member 就擁有了值 'abc'。
這種方法通常用來加入公有方法。在物件本身搜尋一個成員但沒有找到時,就使用構造器的原型(prototype)成員。這種原型機制實現了物件導向所謂的 “繼承(inheritance)”,同時也節省了記憶體。給創建自同一個建構器的所有的物件加上一個方法,只需要給建構器的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,自減1並回傳true;如果它小於0,則傳回false。這樣就實現了由這個架造器所建立物件的dec函數只能用三次的功能。
按慣例,我們建立了一個私有變數self。私有方法可以透過它來存取到物件本身。但這只是一種權宜之計,因為《ECMAScript Language Specification》中有一個錯誤,使得內部函數的this變數被設定成一個錯誤值。
特權方法是在建構器內部透過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是一種特權方法。前三次呼叫myContainer.service()將傳回'abc',之後會傳回null。 service透過呼叫私有方法dec來存取私有變數secret。對於其他物件和方法來說,可以存取到service,但不能直接存取到私有的成員。
這種公有、私有和特權成員模式的存在是由於JavaScript的內在機制:閉包。這意味著一個內部函數永遠可以存取它外部函數的變數和參數,即使外部函數已經回傳。這是JavaScript語言非常強大的特性。目前還沒有關於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中物件、公有成員、私有成員等基礎概念實例總和的詳細內容。更多資訊請關注PHP中文網其他相關文章!