作者 魏楷聰 發(fā)布于 2015年01月20日
一種面向?qū)ο笳Z(yǔ)言需要向開(kāi)發(fā)者提供四種基本能力:
1. 封裝 - 把相關(guān)的信息(無(wú)論數(shù)據(jù)或方法)存儲(chǔ)在對(duì)象中的能力
2. 聚集 - 把一個(gè)對(duì)象存儲(chǔ)在另一個(gè)對(duì)象內(nèi)的能力
3. 繼承 - 由另一個(gè)類(或多個(gè)類)得來(lái)類的屬性和方法的能力
4. 多態(tài) - 編寫(xiě)能以多種方法運(yùn)行的函數(shù)或方法的能力
在JavaScript中僻弹,所有對(duì)象都是從Object對(duì)象繼承過(guò)來(lái)的躲胳。Object中的屬性都是不可枚舉的(propertyIsEnumerable返回false)箩做,因此無(wú)法通過(guò)for...in語(yǔ)句得到其中的屬性扒寄。
在JavaScript中,可以動(dòng)態(tài)添加對(duì)象的屬性,也可以動(dòng)態(tài)刪除對(duì)象的屬性。
1) 基于已有對(duì)象擴(kuò)充其屬性和方法
最后一個(gè)屬性sayName實(shí)際上是指向函數(shù)的指針情龄,意味著該屬性是個(gè)方法。
2) 工廠方式(factory function)
使用this骤视,即可在任意多個(gè)地方重用同一個(gè)函數(shù)
注意:引用對(duì)象的屬性時(shí)鞍爱,必須使用this關(guān)鍵字。
function get(){
?????? alert(username + ", " + password);
}
如果不用對(duì)象或this關(guān)鍵字引用變量尚胞,ECMAScript就會(huì)把它看作局部變量或全局變量硬霍。然后該函數(shù)將查找名為color的局部或全局變量,但是不會(huì)找到笼裳。結(jié)果該函數(shù)將報(bào)“username未定義”的錯(cuò)誤唯卖。
3) 構(gòu)造函數(shù)方式
4) 原型(“prototype”)方式
能用 instanceof 運(yùn)算符檢查給定變量指向的對(duì)象的類型:
alert(person1 instanceof Person);? // outputs "true"
利用對(duì)象的prototype屬性躬柬,可把它看成創(chuàng)建新對(duì)象所依賴的原型
調(diào)用new Person()時(shí)拜轨,原型的所有屬性都被立即賦予要?jiǎng)?chuàng)建的對(duì)象,
意味著所有Person實(shí)例存放的都是指向getInfo()函數(shù)的指針
由于username是引用值橄碾,Person的兩個(gè)實(shí)例都指向同一個(gè)數(shù)組
如果使用原型方式對(duì)象,那么生成的所有對(duì)象會(huì)共享原型中的屬性颠锉,這樣一個(gè)對(duì)象改變了該屬性(引用值)也會(huì)反映到其它對(duì)象當(dāng)中法牲。
單純使用原型方式定義對(duì)象無(wú)法在構(gòu)造函數(shù)中為屬性賦初值,只能在對(duì)象生成后再去改變屬性值琼掠。
使用原型+構(gòu)造函數(shù)方式來(lái)定義對(duì)象拒垃,對(duì)象之間的屬性互不干擾,各個(gè)對(duì)象間共享同一個(gè)方法瓷蛙。
用原型方式定義對(duì)象的函數(shù)屬性(方法)
所有函數(shù)都只創(chuàng)建一次(沒(méi)有內(nèi)存浪費(fèi))悼瓮,而每個(gè)對(duì)象都具有自己的對(duì)象屬性實(shí)例
5) 動(dòng)態(tài)原型方式:在構(gòu)造函數(shù)中通過(guò)標(biāo)志量讓所有對(duì)象共享一個(gè)方法,而每個(gè)對(duì)象擁有自己的屬性
(完)