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 是不可見(jiàn)的课锌。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è)新的共享屬性述雾。