對(duì)象

2018-06-16 12:58 更新

ECMAScript 不使用諸如 C++,Smalltalk,Java 中的類。相反,對(duì)象可以通過(guò)各種方式創(chuàng)建,包括字面符號(hào),或通過(guò) 構(gòu)造器 創(chuàng)建對(duì)象然后運(yùn)行代碼初始化其全部或部分屬性值,為這些屬性分配初始值。每個(gè)構(gòu)造器是一個(gè)擁有名為“prototype”的屬性的函數(shù)。此屬性用于實(shí)現(xiàn) 基于原型的繼承 和 共享屬性 。構(gòu)造器通過(guò) new 表達(dá)式創(chuàng)建對(duì)象:例如,new Date(2009,11) 創(chuàng)建一個(gè)新 Date 對(duì)象。不使用 new 調(diào)用一個(gè)構(gòu)造器的結(jié)果,依賴構(gòu)造器本身。例如,Date() 產(chǎn)生一個(gè)表示當(dāng)前日期時(shí)間的字符串,而不是一個(gè)對(duì)象。


每個(gè)由構(gòu)造器創(chuàng)建的對(duì)象,都有一個(gè)隱式引用 ( 叫做對(duì)象的原型 ) 鏈接到構(gòu)造器的“prototype”屬性值。再者,原型可能有一個(gè)非空 (non-null) 隱式引用鏈接到它自己的原型,以此類推,這叫做 原型鏈 。當(dāng)向?qū)ο蟮囊粋€(gè)屬性提出引用,引用會(huì)指向原型鏈中包含此屬性名的第一個(gè)對(duì)象的此屬性。換句話說(shuō),首先檢查直接提及的對(duì)象的同名屬性,如果對(duì)象包含同名的屬性,引用即指向此屬性,如果該對(duì)象不包含同名的屬性,則下一步檢查對(duì)象的原型;以此類推。

對(duì)象/原型關(guān)系


一般情況下基于類的面向?qū)ο笳Z(yǔ)言的實(shí)例擁有狀態(tài),類擁有方法,并且只能繼承結(jié)構(gòu)和行為。在 ECMAScript 中,對(duì)象擁有狀態(tài)和方法,并且結(jié)構(gòu),行為,狀態(tài)全都可繼承。


不直接包含原型中包含的特定屬性的所有對(duì)象會(huì)共享此屬性及屬性值。圖 1 說(shuō)明了這一點(diǎn):


CF 是一個(gè)構(gòu)造器(也是一個(gè)對(duì)象)。五個(gè)對(duì)象已用 new 表達(dá)式創(chuàng)建 : cf1, cf2, cf3, cf4, cf5。每個(gè)對(duì)象都有名為 q1 和 q2 的屬性。虛線表示隱式原型關(guān)系;例如:cf3 的原型是 CFp。構(gòu)造器 CF 自己有名為 P1 和 P2 的兩個(gè)屬性 , 這對(duì) CFp, cf1, cf2, cf3, cf4, cf5 是不可見的。CFp 的名為 CFP1 的屬性共享給 cf1, cf2, cf3, cf4, cf5 ( 沒(méi)有 CF), 以及在 CFp 的隱式原型鏈中找不到任何名為 q1, q2, 或 CFP1 的屬性。 請(qǐng)注意 ,CF 和 CFp 之間沒(méi)有隱式原型鏈接。


不同于基于類的對(duì)象語(yǔ)言,屬性可以通過(guò)賦值的方式動(dòng)態(tài)添加給對(duì)象。也就是說(shuō),構(gòu)造器并不是非要對(duì)構(gòu)造的對(duì)象的全部或任何屬性命名或賦值。上圖中,可以給 CFp 添加新屬性值的方式為 cf1, cf2, cf3, cf4,cf5 添加一個(gè)新的共享屬性。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)