這裏看出區別的一種方法:
var circle1 = circle(1);
var circle2 = circle(1);
alert(circle1.area == circle2.area);
對於方法一,你會看到false
而方法2得到的true
。這是因爲在第一種情況下,您爲每個創建的對象分配一個新的閉包函數,但兩個對象的功能不同,即使兩者都執行相同的操作。在第二種情況下,對象與其area
方法共享相同的原型對象,該方法在兩種情況下當然是相同的。
通常方法2是優選的有以下幾個原因:
- 對象的創建速度更快,因爲只有自定義屬性需要被初始化。
- 您不會浪費內存來實例化同一事物的多個副本。
- 通過調用
Object.hasOwnProperty
可以輕鬆找出哪些對象屬性具有自定義值。
還有一些缺點要記住。
- 即使您從不創建任何對象,您也總是花時間設置原型。
- 屬性訪問速度稍慢,因爲JavaScript引擎需要先檢查對象屬性,然後再檢查原型對象的屬性(現代JavaScript引擎對此進行了優化)。
- 在原型上放置對象或數組時有一個共同的陷阱,它們將在所有對象實例之間共享。
下面是常見的錯誤的例子:
function NumberCollection()
{
}
NumberCollection.prototype = {
numbers: [],
sum: function()
{
var result = 0;
for (var i = 0; i < this.numbers.length; i++)
result += this.numbers[i];
return result;
}
}
var c1 = new NumberCollection();
c1.numbers.push(5);
alert(c1.sum()); // Shows 5
var c2 = new NumberCollection();
c2.numbers.push(6);
alert(c2.sum()); // Oops, shows 11 because c1.numbers and c2.numbers is the same
這裏正確的做法是:
function NumberCollection()
{
this.numbers = [];
}
NumberCollection.prototype = {
numbers: null,
sum: function()
{
var result = 0;
for (var i = 0; i < this.numbers.length; i++)
result += this.numbers[i];
return result;
}
}
在[使用的「原型」與「本」的可能重複Javascript的](http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript)和[原型與不,有什麼好處?](http://stackoverflow.com/questions/1319325/prototype-vs-not-what-are-benefits)和[使用原型的優勢與直接定義方法的直接關係在構造?](http://stackoverflow.com/questions/4508313/advantages-of-using-prototype-vs-defining-methods-straight-in-the-constructor)和其他人可能... – 2011-06-08 08:44:03
謝謝@Felix ...抱歉重新發布它... – 2011-06-08 08:54:17
這是[鏈接](http://www.packtpub.com/article/using-prototype-property-in-javascript),詳細討論。 – 2011-06-08 09:48:55