JavaScript是世界上是被誤解得最厲害的編程語言。有些人認為它不具備“信息隱藏”的能力,因為JavaScript的對象沒有私有變量和方法。這是誤解。JavaScript對象可以擁有私有成員,下面我們來看看怎么做。(SharkUI.com注:JavaScript并不是真正擁有私有、公有等等OOP的特性,這篇譯文中提到的這些私有、公有、特權(quán)等特性,是利用JavaScript的其他特性(參看本文的“閉包”一節(jié))“模擬”出來的。感興趣的話可以搜索相關(guān)的文章來看,當然也可以不管這些,就當它是真正的OOP來用。Have fun!)
JavaScript是建立在對象之上的。數(shù)組(Array)是對象,函數(shù)(Function)是對象,對象(Objects)當然也是對象。那什么是對象呢?對象是一組“名稱:值”對(name-value pair)的集合。名稱是字符串,值卻可以是字符串、數(shù)值、布爾或?qū)ο螅ò〝?shù)組和函數(shù))。對象通常是用哈希表來實現(xiàn)的,以便可以快速地取值。
如果值是一個函數(shù),我們就可以把它當作一個“方法”。當對象的一個方法被執(zhí)行,變量this就被設(shè)為對象本身。如此,方法就可以通過this變量來訪問對象的實例。
對象可以通過“構(gòu)造器(constructor)”來創(chuàng)建。構(gòu)造器是一個擁有初始化對象的函數(shù)。構(gòu)造器提供了類似其他語言中的“類(class)”所提供的特性和功能,包括靜態(tài)變量和方法。
對象的所有成員都是公有成員。任何函數(shù)都可以訪問、修改或者刪除這些成員,當然也可以添加新的成員。給對象添加成員的兩種主要方法:
這種方法一般用來初始化對象實例的公有變量。構(gòu)造器的this變量被用來給對象添加成員:
function Container(param) { this.member = param;}構(gòu)造一個新的對象:
var myContainer = new Container('abc');然后,公有變量 myContainer.member 就擁有了值 'abc'。
這種方法通常用來添加公有方法。在對象本身搜尋一個成員但沒有找到時,就使用構(gòu)造器的原型(prototype)成員。這種原型機制實現(xiàn)了面向?qū)ο笏^的 “繼承(inheritance)”,同時也節(jié)省了內(nèi)存。給創(chuàng)建自同一個構(gòu)造器的所有的對象加上一個方法,只需要給構(gòu)造器的prototype增加一個函數(shù):
Container.prototype.stamp = function (string) { return this.member + string;}然后我們就可以調(diào)用這個方法:
myContainer.stamp('def')返回'abcdef'。
私有(Private)成員是由構(gòu)造器創(chuàng)建的。通常構(gòu)造器中用var聲明的變量和函數(shù)參數(shù)成為私有成員。
function Container(param) { this.member = param; var secret = 3; var self = this;}這個構(gòu)造器創(chuàng)建了三個私有的實例變量:param,secret和self。
新聞熱點
疑難解答
圖片精選