JavaScript 2.0新特性搶先看 向經(jīng)典語言靠近
作為一個開發(fā)者和作家,我的一部分工作就是跟隨web世界最新發(fā)展潮流——不管是關(guān)于公司合并、在線購物潮流、或者是編程技巧。我承認(rèn)如今很難跟上 業(yè)界里發(fā)生的所有事情,但是有個四處流傳的小道消息卻吸引了許多的目光:JavaScript2.0提案。作為新的JavaScript2.0\EMCAScript 4.0計劃于2009年終稿,但是日前已經(jīng)做了很多的工作-包括好的、不好的。今天,我們來看看這份提案規(guī)范的一部分,看下他們是在改進(jìn)這門語言還是狗尾續(xù)貂。
JavaScript的歷史
為了更好的理解JavaScript標(biāo)準(zhǔn)是如何實現(xiàn)的,讓我們簡要的看下這門語言的歷史吧
JavaScript是ECMAScript腳本語言的一個分支。ECMAScript 是Ecma國際組織標(biāo)準(zhǔn)化的,這門語言的另外2個分支是ActionScript(macroMedia,Adobe)和JScript(微軟)。JavaScript是有Netscape的Brendan Eich開發(fā)的,最初叫Mocha而后是LiveScript,最后改為JavaScript。1993.3月,Sun公司發(fā)布了支持 JavaScript的Navigator2.0(譯者:我感覺這是錯誤的,可查看原文)。鑒于JavaScript作為客戶端腳本語言取得廣泛流行,微軟制定了自己的腳本語言JScript,發(fā)布于1996.8月的IE3.0中。Netscape公司在日內(nèi)瓦提交了JavaScript給Ecma國際標(biāo)準(zhǔn)化組織,申請成為標(biāo)準(zhǔn)。
Ecma國際標(biāo)準(zhǔn)化組織是個管理信息、通信系統(tǒng)的、基于成員制度,非營利性國際機(jī)構(gòu) 。這個機(jī)構(gòu)起初是為了標(biāo)準(zhǔn)化歐洲的計算而于1991年成立,在它成立后的40年間,Ecma總共出臺了370封標(biāo)準(zhǔn)和90個科技報告,其中包括了CD- ROM卷和文件系統(tǒng),c++語言規(guī)范和他們的開放xml格式。第一版的ECMAScript(Ecma-262)于1997在Ecma全員大會上通過。不管JavaScript還是JScript他們都是兼容ECMAScript的,同時也提供了Ecma規(guī)范沒有提供的特殊的額外的特性。甚至在今天,JavaScript和JScript依然有個很多不兼容的地方。JavaScript受如java、c++等面向?qū)ο笳Z言的影響很深,這也意味著初 學(xué)者能很容易的上手。
JavaScript2.0新特性語言的增強(qiáng)
更加的面向?qū)ο?/P>
迄今為止,JavaScript是使用的原型來做繼承的,而不是經(jīng)典的面向?qū)ο笫降睦^承自父類。事實上,如下面實例的一樣,如今JavaScript沒有class的東西:
- // Current JavaScript 1.x "Class" Definition
- function MyClass()
- {
- this.member1 = "a string";
- this.member2 = 10;
- }
- var myClass = new MyClass(); // class instantiation
- // JavaScript 2.0 Class Definition
- class TrueClass
- {
- this.member1 = "a string";
- this.member2 = 10;
- }
- var trueClass = new TrueClass(); // class instantiation
當(dāng)對象的構(gòu)造函數(shù)和他們類型角色一起的時候,構(gòu)造函數(shù)會翻倍。使用new調(diào)用函數(shù)的時候會創(chuàng)建一個新對象,而后你就可以使用被bind到這個對象的本地關(guān)鍵字this來調(diào)用這個函數(shù)。函數(shù)的原型決定了這個對象的原型。不管什么 類型的值賦予一個對象的原型,那么它都會被他所有的實例和漢字共享。使用原型,JavaScript可以模擬許多基于class的特性,盡管有些古怪。舉個例子,在下面的代碼中,myOtherDog嘗試去重載父類Dog的getBreed() 函數(shù)。雖然myOtherDog的getBreed()函數(shù)是能夠?qū)崿F(xiàn)的,但是他沒有重載成功——給了myOtherDog兩個面包。
- function Dog(name)
- {
- this.name = name;
- this.bark = function() { alert('Woof!'); };
- this.displayName = function() { alert(this.name); };
- };
- var myDog = new Dog('Killer');
- myDog.displayName(); //Killer
- myDog.bark(); //Woof!
- Dog.prototype.getBreed = function()
- {
- alert("Mutt");
- };
- myDog.getBreed(); //Mutt
- myOtherDog = new Dog('Bowzer');
- // this hides getBreed() from other Dogs
- myOtherDog.getBreed = function()
- {
- return "Lhasa Apso";
- };
- alert(myOtherDog.getBreed()); //Lhaso Apso and Mutt!
- alert(myDog.getBreed()); //function is undefined
強(qiáng)類型
像大多數(shù)的腳本語言一樣,JavaScript也是弱類型的。解釋器會在運(yùn)行時,基于值來決定某變量的數(shù)據(jù)類型。這種松散性使得開發(fā)者可以很靈活的 重用和比較變量。在后種情況,使用強(qiáng)制類型轉(zhuǎn)換就可以比較兩種不同數(shù)據(jù)類型的值;JavaScript會自動在比較之前將他們轉(zhuǎn)化成相同的類型。
- alert( "42" == 42 ); //true
- alert( ("42" == 42) + 1 ); //2. the boolean true evaluates to 1.
- alert( "I live at " + 99 + " Renolds street."); // the 99 int is converted to a string.
相反的,JavaScript2.0會強(qiáng)類型化了些,這就意味著必須顯式的申明變量的類型,腳本引擎不會強(qiáng)制類型轉(zhuǎn)換了。類型可以賦予屬性、函數(shù)參數(shù)、函數(shù)返回值、變量、對象、數(shù)組的初始化對象。如果沒有定義類型,那么變量或者屬性被設(shè)置為默認(rèn)的Object類型,這是所有的數(shù)據(jù)類型層級的基類。使用:后跟類型申明的是賦類型的語法:
- var a:int = 100; //variable a has a type of int
- var b:String = "A string."; //variable b has a type of String
- function (a:int, b:string)//the function accepts two parameters, one of type int, one of type string
- function(...):int //the function returns a value with a type of int
為了進(jìn)行上述的比較,你需要轉(zhuǎn)換類型:
- alert( int("42") == 42 ); //true
- alert( int("42" == 42) + 1 ); //2
- alert( "I live at " + string(99) + " Renolds street.");
程序單元體
借鑒了各種流行js框架,程序單元體是很有用的代碼模塊,它可以在運(yùn)行時導(dǎo)入。當(dāng)框架和自定義庫數(shù)量越來越多的時候,這些已經(jīng)成為web程序不可或缺的組成部分。設(shè)想下,包含了成千上萬行代碼的庫們,一次性下載他們已經(jīng)不合時宜了。這是偽代碼:
- use unit Effects "http://mysite/lib/Effects";
- use unit Utils "http://mysite/lib/Utils";
- var panel = new Panel();
- panel.setTime(Util.getFormattedTime());
編譯時的類型檢查
在JavaScript2.0 里,你可以使用嚴(yán)格模式來編譯JavaScript模塊。在運(yùn)行之前,它可以檢查幾個重要的方面的完整性,JavaScript2.0新特性包括:
靜態(tài)類型檢查
引用名稱確認(rèn)
對常數(shù)的非法賦值
證比較的兩個值有合法的類型
常數(shù)
先前的JavaScript開發(fā)者不得不使用命名規(guī)范或者精心制定的工作規(guī)則保護(hù)他們的常量。而這些在JavaScript2.0都是不需要的:
- //JavaScript 1.x constant
- var CULTURE_CONST = "Do you really want to change me?"; // constant in appearance only.
- //JavaScript 2.0 constant
- const HAMMER_TIME = "You can't touch this!" // a true constant.
命名空間
隨著js框架的不斷涌現(xiàn),使用命名空間已經(jīng)變得越來越必要了。這個標(biāo)準(zhǔn)目前被用作創(chuàng)建全局對象來保護(hù)你自己的功能不給先前的全局對象和函數(shù)擊倒在地(直譯)。
JavaScript2.0新特性總結(jié)
許多向?qū)?.0提案進(jìn)行了猛烈的抨擊,批評它在想經(jīng)典的語言如c++、java在靠近。
“...JavaScript是動態(tài)、靈活的,使用原型繼承和對象模型是很實用,很基礎(chǔ)的優(yōu)勢,為什么有人要把這些那么優(yōu)雅、靈活的東西變成java呢,java基本上強(qiáng)制性的讓程序員使用古典的,基于class的繼承——我搞不懂?!?/P>
而我個人對此很感受很復(fù)雜,即歡迎像class,命名空間,常量這樣好的變化,也對強(qiáng)類型腳本變量很不感冒??傮w上說,JavaScript冒著對業(yè)余程序員變得更嚴(yán)格,相應(yīng)的更嚴(yán)肅的危險 。不過,我也想應(yīng)該感謝那些商業(yè)網(wǎng)站能夠使用像我這樣的專業(yè)人士來編碼他們的業(yè)務(wù)流程。不管結(jié)果如何,無疑web開發(fā)的格局將會發(fā)生戲劇性的改變。
【編輯推薦】