星期一, 8月 07, 2006

AJAX奇緣(二)

繼續上一篇AJAX奇緣。

因為用續傳軟體無法攻略,所以我決定嘗試所謂的RIA,沒錯,就是Rich Internet Application。和一般應用程式不同的是,RIA完全不需要佈署,客戶端只需要有瀏覽器。在這麼簡單的系統要求下,RIA卻帶來令人驚奇的可能性,讓「Web Page」的定義被顛覆,打破人們對於網路的傳統印象,帶了了充滿互動性的新紀元(不過還是有缺點,比如通常不能自由存取Local filesystem),而本座的RIA之路,就由柔道小霸王漫畫下載器開始吧XD

於是本座就開始鑽研Javascript了,Javascript雖然名字裡面有個Java,可是語言的特性和Java可以說是完全不同啊XD。以OOP來說,Javascript的function宣告以後可以直接當物件來用,如:

fuction A()
{
this.foo=1;
}

obj = new A();
obj.foo=10;

光這點就讓人適應困難,這不是OOP,這不是OOP,這不是OOP......

Javascript的繼承機制更奇怪,與其說是「繼承」,不如說是「包含」,詳細來說是採用所謂的「prototype」機制,用new宣告出subclass(也就是function)以後,以subclass.prototype=new parent()來進行「掛勾」,subclass不但可以繼承類別,連instance也可以拿來繼承,如subclass.prototype=foobar;這什麼鬼啊orzorzorzorzorz

Javascript的怪規則也很多,很多在別的OOP語言正常運作的東西在Javascipt會爆掉,加上Javascript本身超強的除錯環境,往往就不知不覺被陰了,比如:

function foo(val)
{
this.report=function()
{
alert(val);
}
}
x=new foo(10);
x.val=20;
x.report(); //猜猜看我是多少

各位聰明的看官,最後x.report()會顯示多少呢?各位都猜20?很可惜答案是10 XD,這牽涉到Javscript的封裝機制,在Javascript裡,以下兩種敘述是不同的:

版本一:

function foo()
{
i=10; //被JS視為private member
//物件本身的公開函數也無法存取orz
}

版本二:

function foo()
{
this.i=10; //This is a public member
}

在剛剛上面所提到的謎題,val並沒有加入this修飾,所以被Javascript視為私有成員,也就是說val和this.val雖然看起來長得像,可是他們會被Javascript視為不同的變數,前者指向當初建構子所傳遞進來的參數,後者則是公開成員,因此,如果剛剛的謎題加入下面一行:

alert(x.val);

會顯示出20.....

基本上應該蠻詭異的,對OOP語言,比如C++,C#,Java越熟,學起Javascript應該越會吐血

Javascript的其他機車之處下回再分曉。 全文連結

2 意見:

匿名 提到...

真的挺有趣的 :P
不過JavaScript一直另我困惑的是
常常寫好的一個Script在ie下可跑
結果到firefox下又不能跑了orzorzorzorz

d8888 提到...

呵呵
這就是我們需要Framework的原因了

netscape/firefox和IE JS的implementation真的差蠻多的,光是瀏覽器的差異性加上怪怪的錯誤訊息(特別是IE)就可以秒殺一堆人了XD。