JavaScript2.0 :搶先嚐鮮

 

http://www.webreference.com/programming/javascript/rg38/2.html

作者爲我們簡要的介紹了下正在制定中的JavaScript2.0標準,有許多新特性的介紹和相應的代碼演示:

 

作爲一個開發者和作家,我的一部分工作就是跟隨web世界最新發展潮流——不管是關於公司合併、在線購物潮流、或者是編程技巧。我承認如今很難跟上 業界裏發生的所有事情,但是有個四處流傳的小道消息卻吸引了許多的目光:JavaScript2.0提案。作爲新的 JavaScript2.0/EMCAScript 4.0計劃於2009年終稿,但是日前已經做了很多的工作-包括好的、不好的。今天,我們來看看這份提案規範的一部分,看下他們是在改進這門語言還是狗尾 續貂。

JavaScript的歷史

爲了更好的理解JavaScript標準是如何實現的,讓我們簡要的看下這門語言的歷史吧

JavaScript是ECMAScript腳本語言的一個分支。ECMAScript 是Ecma國際組織標準化的,這門語言的另外2個分支是ActionScript(macroMedia,Adobe)和JScript(微軟)。 JavaScript是有Netscape的Brendan Eich開發的,最初叫Mocha而後是LiveScript,最後改爲JavaScript。1993.3月,Sun公司發佈了支持 JavaScript的Navigator2.0(譯者:我感覺這是錯誤的,可查看原文)。鑑於JavaScript作爲客戶端腳本語言取得廣泛流行,微 軟制定了自己的腳本語言JScript,發佈於1996.8月的ie3.0中。Netscape公司在日內瓦提交了JavaScript給Ecma國際標 準化組織,申請成爲標準。

Ecma國際標準化組織是個管理信息、通信系統的、基於成員制度,非營利性國際機構 。這個機構起初是爲了標準化歐洲的計算而於1991年成立,在它成立後的40年間,Ecma總共出臺了370封標準和90個科技報告,其中包括了CD- ROM卷和文件系統,c++語言規範和他們的開放xml格式。第一版的ECMAScript(Ecma-262)於1997在Ecma全員大會上通過。不 管JavaScript還是JScript他們都是兼容ECMAScript的,同時也提供了Ecma規範沒有提供的特殊的額外的特性。甚至在今 天,JavaScript和JScript依然有個很多不兼容的地方。JavaScript受如java、c++等面嚮對象語言的影響很深,這也意味着初 學者能很容易的上手。

語言的增強

更加的面向對象

迄今爲止,JavaScript是使用的原型來做繼承的,而不是經典的面向對象式的繼承自父類。事實上,如下面實例的一樣,如今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

當對象的構造函數和他們類型角色一起的時候,構造函數會翻倍。使用new 調用函數的時候會創建一個新對象,而後你就可以使用被bind到這個對象的本地關鍵字this來調用這個函數。函數的原型決定了這個對象的原型。不管什麼 類型的值賦予一個對象的原型,那麼它都會被他所有的實例和漢字共享。使用原型 ,JavaScript可以模擬許多基於class的特性,儘管有些古怪。舉個例子,在下面的代碼中,myOtherDog嘗試去重載父類Dog的 getBreed() 函數。雖然myOtherDog的getBreed()函數是能夠實現的,但是他沒有重載成功——給了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

強類型

像大多數的腳本語言一樣,JavaScript也是弱類型的。解釋器會在運行時,基於值來決定某變量的數據類型。這種鬆散性使得開發者可以很靈活的 重用和比較變量。在後種情況,使用強制類型轉換就可以比較兩種不同數據類型的值;JavaScript會自動在比較之前將他們轉化成相同的類型。

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會強類型化了些,這就意味着必須顯式的申明變量的類型,腳本引擎不會強制類型轉換了。類型可以賦予屬性、函數參 數、函數返回值、變量、對象、數組的初始化對象。如果沒有定義類型,那麼變量或者屬性被設置爲默認的Object類型,這是所有的數據類型層級的基類。使 用:後跟類型申明的是賦類型的語法:

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

爲了進行上述的比較,你需要轉換類型:

alert( int("42") == 42 ); //true
alert( int("42" == 42) + 1 ); //2
alert( "I live at " + string(99) + " Renolds street.");

程序單元體

借鑑了各種流行js框架,程序單元體是很有用的代碼模塊,它可以在運行時導入。當框架和自定義庫數量越來越多的時候,這些已經成爲web程序不可或缺的組成部分。設想下,包含了成千上萬行代碼的庫們,一次性下載他們已經不合時宜了。這是僞代碼:

use unit Effects "http://mysite/lib/Effects";
use unit Utils "http://mysite/lib/Utils";

var panel = new Panel();
panel.setTime(Util.getFormattedTime());

編譯時的類型檢查

在JavaScript2.0 裏,你可以使用嚴格模式來編譯JavaScript模塊。在運行之前,它可以檢查幾個重要的方面的完整性,包括:

靜態類型檢查
引用名稱確認
對常數的非法賦值
保證比較的兩個值有合法的類型
常數

先前的JavaScript開發者不得不使用命名規範或者精心制定的工作規則保護他們的常量。而這些在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框架的不斷涌現,使用命名空間已經變得越來越必要了。這個標準目前被用作創建全局對象來保護你自己的功能不給先前的全局對象和函數擊倒在地(直譯)。

總結

許多向對2.0提案進行了猛烈的抨擊,批評它在想經典的語言如c++、java在靠近。

“...JavaScript是動態、靈活的,使用原型繼承和對象模型是很實用,很基礎的優勢,爲什麼有人要把這些那麼優雅、靈活的東西變成java呢,java基本上強制性的讓程序員使用古典的,基於class的繼承——我搞不懂。”

而我個人對此很感受很複雜,即歡迎像class,命名空間,常量這樣好的變化,也對強類型腳本變量很不感冒。總體上說,JavaScript冒着對 業餘程序員變得更嚴格,相應的更嚴肅的危險 。不過,我也想應該感謝那些商業網站能夠使用像我這樣的專業人士來編碼他們的業務流程。不管結果如何,無疑web開發的格局將會發生戲劇性的改變。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章