prototype 源自法語,軟件界的標準翻譯爲“原型”,代表事物的初始形態,也含有模型和樣板的意義。JavaScript 中的prototype 概念恰如其分地反映了這個詞的內含,我們不能將其理解爲C++的prototype 那種預先聲明的概念。
JavaScript 的所有function 類型的對象都有一個prototype 屬性。這個prototype 屬性本身又是一個object 類型的對象,因此我們也可以給這個prototype 對象添加任意的屬性和方法。既然prototype是對象的“原型”,那麼由該函數構造出來的對象應該都會具有這個“原型”的特性。事實上,在構造函數的prototype 上定義的所有屬性和方法,都是可以通過其構造的對象直接訪問和調用的。也可以這麼說,prototype 提供了一羣同類對象共享屬性和方法的機制。
我們先來看看下面的代碼:
function Person(name)
{
this.name = name; //設置對象屬性,每個對象各自一份屬性數據
};
Person.prototype.SayHello = function() //給Person 函數的prototype 添加SayHe
llo 方法。
{
alert("Hello, I'm " + this.name);
}
var BillGates = new Person("Bill Gates"); //創建BillGates 對象
var SteveJobs = new Person("Steve Jobs"); //創建SteveJobs 對象
BillGates.SayHello(); //通過BillGates 對象直接調用到SayHello 方法
SteveJobs.SayHello(); //通過SteveJobs 對象直接調用到SayHello 方法
alert(BillGates.SayHello == SteveJobs.SayHello); //因爲兩個對象是共享prototyp
e 的SayHello,所以顯示:true
程序運行的結果表明,構造函數的prototype 上定義的方法確實可以通過對象直接調用到,而且代碼是共享的。顯然,把方法設置到prototype 的寫法顯得優雅多了,儘管調用形式沒有變,但邏輯上卻體現了方法與類的關係,相對前面的寫法,更容易理解和組織代碼。