4.2.1對象
盡管Js包括對類的定義語法兄春,Js對象并不是和C++父叙,Smalltalk,或者java一樣功能上功能上基于類涌乳。取而代之的是對象可以通過多種方式被創(chuàng)建甜癞,包括通過一個聲明或者通過創(chuàng)造對象然后把初始值分配到對應(yīng)的原型來執(zhí)行初始化所有或者部分的構(gòu)造體。每個構(gòu)造體都是一個函數(shù)蒸辆,該函數(shù)有一個叫做“protoytpe”的性質(zhì)征炼,被用來實(shí)現(xiàn)基于原型繼承和原型共享谆奥。對象用構(gòu)造體通過new創(chuàng)建成拂玻,比如 new Date(2009,11)創(chuàng)建了一個新的日期對象。不使用new調(diào)用構(gòu)造體后的結(jié)果取決于構(gòu)造體本身魄懂。比如闯第,Date()善成一個表示當(dāng)前日期和時(shí)間的字符串而不是一個對象。
每個通過構(gòu)造體創(chuàng)建的對象都有一個隱藏引用(叫做對象的原型)來表示構(gòu)造體的prototyep原型填帽。此外咙好,一個原型可能有一個不能為NULL的隱藏引用聯(lián)系到他的原型,以此類推敷扫。這叫做原型鏈。當(dāng)一個引用在對象中被用于連接一個原型绘迁。這個引用是對應(yīng)原型的包含這個名字的原型的原型鏈里面第一個對象的原型所使用的名字卒密。
插圖
在基于類的面向?qū)ο笳Z言中,常規(guī)來說膛腐,實(shí)例攜帶狀態(tài),類攜帶方法哲身,只有構(gòu)造和行為會被繼承贸伐。在Js中,狀態(tài)和方法都由對象攜帶脯丝,而構(gòu)造,行為和狀態(tài)都可以繼承晕拆。
不直接博涵原型中包含的特定屬性的所有對象會共享此屬性和它的值。
CF是一個構(gòu)造體(也是個對象)潦匈。五個對象是通過使用New方式創(chuàng)建的:cf1, cf2, cf3, cf4, cf5赚导。這些對象每個都包含叫做q1,q2的原型吼旧。虛線表示隱藏的原型關(guān)系未舟;所以,舉個例子裕膀,cf3的原型是CFp。構(gòu)造體CF有兩個自己的原型寸齐,叫做P1和P2抄谐,對于CFp,cf1毅厚,cf2,cf3吸耿,cf4酷窥,cf5來說是無法訪問的。在CFp中的叫做CFP1的原型由cf1板乙,cf2,cf3募逞,cf4,cf5共享(但不是通過CF)刺啦,任何在CFp中找到的隱藏屬性來呢都不會被命名為q1,q2或者CFP1纠脾。需要注意到的是CF和CFp中并沒有隱藏的原型鏈。
不像大部分基于類的對象語言糊渊,原型可以通過為他們添加值來動態(tài)的加入到對象中慧脱。這是說,用來命名或者賦值給任何已經(jīng)被構(gòu)造的對象的原型中時(shí)構(gòu)造體不是必須的菱鸥。上圖中,可以為共享的原型cf1殷绍,cf2鹊漠,cf3,cf4躯概,cf5通過附一個新值給CFp中的原型來實(shí)現(xiàn)共享原型。
盡管Js對象并不是內(nèi)在基于類的怔鳖,還是可以很方便的基于構(gòu)造體固蛾,函數(shù),對象原型和方法的常規(guī)模式來定義類class的抽象献幔。Js的內(nèi)奸對象自己也是按照一個類class的模式趾诗。從ECMAScript2015開始蹬蚁,Js語言會包括句法類的定義郑兴,它允許程序員利用內(nèi)建對象簡明的定義類。
4.2.2 ECMAScript的嚴(yán)格變量
Js語言意識到有這種可能性:一些語言用戶也許希望限制語言中可使用的一些特性的叽粹∪匆ǎ基于對于安全性的考慮,他們希望有這種限制來避免一些錯誤特性辆脸,或更強(qiáng)勁的錯誤檢查啡氢,或者一切其他理由。為了支持這種可能性浪箭,Js定義了語言的嚴(yán)格變量。嚴(yán)格變量排除了一些常規(guī)Js語言的指定的句法和語義匹表,修改了一些語義細(xì)節(jié)的特性。嚴(yán)格模式還指定了對于語言非嚴(yán)格模式中不會跑出錯誤的情況會跑出額外的錯誤的條件袍镀。
Js的嚴(yán)格變量通常關(guān)聯(lián)到語言的嚴(yán)格模式冻晤。Js的嚴(yán)格模式的語法語義下的選擇和使用明確的是由單獨(dú)Js源文本單元這一層構(gòu)成。因?yàn)閲?yán)格模式在句法原文本單元中被選擇设江,所以嚴(yán)格模式只有在本地同一塊源文本單元中強(qiáng)加限制條件攘轩。嚴(yán)格模式不會限制或修改任何需要操作各種源文本數(shù)據(jù)的Js句法。一個完整的Js程序可能會有嚴(yán)格模式代碼和非嚴(yán)格模式代碼構(gòu)成歼捏。在這種情況下,嚴(yán)格模式只對那些被定義為嚴(yán)格模式的源文本單元起作用瞳秽。
為了確認(rèn)這個說明,一個Js實(shí)現(xiàn)方式需要實(shí)現(xiàn)非嚴(yán)格模式和嚴(yán)格模式拂苹。而且一個Js實(shí)現(xiàn)方式需要能支持嚴(yán)格模式和非嚴(yán)格模式結(jié)合起來運(yùn)行的程序