從 prototype.js 深入學習 javascript 的面向對象特性
js是一門很強大的語言,靈活,方便。 目前我接觸到的語言當中,從語法角度上講,只有 Ruby 比它更爽。
不過我接觸的動態語言只有: js ruby python flash的as 簡單的幾門, 應該算是井底之蛙之見。
js 語法成分簡單,沒有 ruby 語言復雜。所以有時候我覺得她更干凈(Ruby Fans 不要攻擊我哦,我也是很愛很愛很愛Ruby的)!
prototype
.js 無疑是 js的漂亮之作,從它身上應該可以學到一些東西。
如果你用 js 在頁面僅僅能寫出 if, alert等簡單的驗證代碼,或者想多了解一下Js, 那么此文可能對你有幫助。
好了,開始吧。
現在我突然想起了 Thinking in java?中的 "一切皆是對像", 其實我覺得這句話 有點不適合 java 反倒是更適合 js
1.怎樣構造(初始化)對象?
js 代碼

var?Prototype?=?
{????
??Version:?'1.5.0_rc1',????
??ScriptFragment:?'(?:)((\n|\r|.)*?)(?:<\/script>)',????
???

??emptyFunction:?function()?
{},????

??K:?function(x)?
{return?x}????
}????就這樣,初始化了一個對象(名字就叫 Prototype),以及對象的四個成員: Version, ScriptFragment, emptyFunction, K
我們也來試試:
js 代碼

var?bbs?=?
{????
?name:?'JavaEye',????
?version:?'2.0',????
?describe:?"做最棒的軟件開發交流區",????

?sayHello:?function()?
{?alert("hello,?i'm?javaeye!?")?}????
}???于是你可以這樣使用: bbs.name 或 bbs.sayHello()
看到嗎? sayHello 是一個方法哦,不要驚慌,"一切都是對象",所以它和 name 是一樣的,只不過初始化,或定義的語法不一樣。想起 js 中的正則表達式中的那兩個桿桿了嗎? 可愛吧!
方法是對象,所以它可以被當作參數傳遞,或者作為方法的返回值。
所以 Prototype 中有一個 Version 屬性,還有一個匹配 script 的正則式字符串, 一個空方法emptyFunction,還有一個方法 K, 它僅僅返回參數。
沒問題吧,繼續!
2. 構造函數?
先讓我們寫段代碼吧(中學時,我語文極差(大學沒語文了),我想寫代碼讓你們明白我心里真實的想法):
先看結果:
從 alert(bencode.name); 可以知道,bencode是對象, 而 name 就是 bencode 的屬性, 它被正確地初始化為 "bencode"
所以 var bencode = new Persion("bencode"); 就是構造了一個新的對象,Person() 相當于構造函數
所以 new 這個關鍵字, 就是構造一個新的對象,并且在這個對象上調用相應的方法,并將這個對象返回。
按上面說: 方法 如果用在 在 new 后面,就相當于成了構造函數了。
話又說回來了, 如果 var bencode = new Persion("bencode") 是 構造了一個對象,像Java, 那么 Person 是不是類呢?
可是 Person 不是方法嗎? 可是方法不也是對象嗎? 類也是對象?
一切皆對象?
本來無一物!
好了,看 prototype.js吧
如果我們要繼承一個類,只要: