< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>
Class源代碼
下面是prototype架構源代碼的第二段代碼:
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}
文法
什麼是函數?函數(function)是一個可執行的javascript代碼段,有javascript程式定義或由javascript實作預定義。雖然函數隻被定義一次,但是javascript程式卻可以多次執行或調用它。javascript的函數帶有實際參數或者形式參數,用于指定這個函數執行計算要使用的一個或多個值,而且它還能傳回一個值,以表示計算結果。javascript語言提供了許多預定義函數,如Math.sin(),它用于計算角的正弦值。
函數的實際參數:Arguments對象。在一個函數體内,辨別符arguments具有特殊含義。它是調用對象的一個特殊屬性,用來引用Arguments對象。Arguments對象就像數組,可以按照數字擷取傳遞給函數的參數值。但它并非真正的Array對象。Arguments對象也定義了callee屬性。盡管定義javascript函數時有固定數目的命名參數,但當調用這個函數時,傳遞給他的參數數目卻可以是任意的。數組arguments[]允許完全地存取那些實際參數值,即使某些參數還沒有被命名。假定你定義了一個函數f,要傳遞給他一個實際參數x,如果你用兩個實際參數來調用這個函數,那麼在函數體内,用形式參數名x或者arguments[0]可以存取第一個實際參數。而第二個實際參數隻能通過arguments[1]來存取。而且和所有數組一樣,arguments具有length屬性,用于說明他所含有的元素個數。是以,在函數f的主體内,如果調用時使用的是兩個實際參數,那麼arguments.length的值是2.在這裡,我們多次用到了“arguments數組”,這種說法是不準确的。請記住,arguments并非真正的數組,他是一個Arguments對象。
Arguments對象有一個非同尋常的特性。當函數具有命名了的參數時,Arguments對象的數組元素是存放函數參數的局部變量的同義詞。arguments[]數組和命名了的參數不過是引用同一變量的兩種不同方法。用參數名改變一個參數的值同時會改變通過arguments[]數組獲得的值。通過arguments[]數組改變參數的值同樣會改變用參數名獲得的參數值。
ECMAScript v3給所有函數定義了兩個方法call()和apply()。使用這兩個方法可以像調用其他對象的方法一樣調用函數。call()和apply()都是要調用的函數的對象,在函數體内這一參數是關鍵字this的值。call()的剩餘參數是傳遞給要調用的函數的值。例如,要把兩個數字傳遞給函數f(),并将他作為對象o的方法調用,可以用如下代碼:
f.call(o,1,2);
apply()方法和call()方法相似,隻不過要傳遞給函數的參數是由數組指定的。
javascript有對象和類的概念,但是沒有内建繼承的概念。我們可以通過構造函數來實作類似與内建繼承的功能。在構造函數中,設定為this的屬性的任何東西随後都可以作為對象的一個成員來使用。構造函數有兩個特性:他有new運算符調用;傳遞給他的是一個對新建立的空對象的引用,将該引用作為關鍵字this的值,而且他還要對新建立的對象進行适當的初始化。
代碼解析及其使用方法
Class是一個全局對象,他的唯一方法就是create,作用是傳回一個函數,類似于ruby的類。prototype通過一個全局對象Class從形式上将函數和類差別開來。Class.create()僅僅是傳回一個空類,而且它會預設為這個類是具有initialize方法的,是以要使用這個類,至少需要有一個構造函數,這就需要使用到類的繼承。(作者注----這樣解釋可能有點難以了解哦,本人水準不高,隻領悟到這一層次。)
示例:
var Animal = Class.create();
Animal.prototype = {
initialize: function(name, sound) {
this.name = name;
this.sound = sound;
},
speak: function() {
alert(name + " says: " + sound + "!");
}
};
var snake = new Animal("Ringneck", "hissssssssss");
snake.speak();
// -> alerts "Ringneck says: hissssssssss!"
var Dog = Class.create();
Dog.prototype = Object.extend(new Animal(), {
initialize: function(name) {
this.sound = "woof";
}
});
var fido = new Dog("Fido");
fido.speak();
// -> alerts "Fido says: woof!"
本文轉自 netcorner 部落格園部落格,原文連結: http://www.cnblogs.com/netcorner/archive/2007/08/16/2912304.html ,如需轉載請自行聯系原作者