作者 魏楷聰 發(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)
注意:引用對(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ì)象,那么生成的所有對(duì)象會(huì)共享原型中的屬性颠锉,這樣一個(gè)對(duì)象改變了該屬性(引用值)也會(huì)反映到其它對(duì)象當(dāng)中法牲。
單純使用原型方式定義對(duì)象無(wú)法在構(gòu)造函數(shù)中為屬性賦初值,只能在對(duì)象生成后再去改變屬性值琼掠。
使用原型+構(gòu)造函數(shù)方式來(lái)定義對(duì)象拒垃,對(duì)象之間的屬性互不干擾,各個(gè)對(duì)象間共享同一個(gè)方法瓷蛙。
5) 動(dòng)態(tài)原型方式:在構(gòu)造函數(shù)中通過(guò)標(biāo)志量讓所有對(duì)象共享一個(gè)方法,而每個(gè)對(duì)象擁有自己的屬性
(完)