JavaScript的面向對象方法以及差別
更新時間:2008年03月31日 13:46:25 作者:
JS作為一種動態(tài)語言,在語法上有相當大的自由度,所以造成了一種功能,有N種寫法的局面。
在JS中實現OOP,一般來說有兩種方法:
第一種:使用this關鍵字
function Class1()
{
this.onclick = function(e)
{
for (var i=0; i < 1000; i++)
{
var a = new Date();
}
}
}
使用this.的方法可以很靈活地給對象添加屬性和方法,而且和大部分的OOP語言都相似,甚至在運行中都可以添加。
第二種:使用prototype關鍵字
function clickFunc(e)
{
for (var i=0; i < 1000; i++)
{
var a = new Date();
}
}
function Class2()
{
}
Class2.prototype.onclick = clickFunc;
這種用法上來講就沒有第一種顯得靈活。不過在一個對象new出來之前,也是一樣可以隨時添加一個對象的屬性和方法。
可是他們并不是相等的,相對來說,我更喜歡第一種,因為第一種方法相對比較集中,比較容易閱讀代碼。但是在運行的時候,他們運行的效率卻差別相當地大。以下讓我們看一下測試代碼吧:
var total = new Array();
function Test1()
{
var a = new Date();
for (var i=0; i < 10000; i++)
{
var c = new Class1();
//total.push(c);
}
var b = new Date();
alert(b.getTime()-a.getTime());
}
function Test2()
{
var a = new Date();
for (var i=0; i < 10000; i++)
{
var c = new Class2();
//total.push(c);
}
var b = new Date();
alert(b.getTime()-a.getTime());
}
第一步作執(zhí)行時間的測試:發(fā)現Test1()需要142ms,而Test2()僅需50ms.發(fā)現時間效率上來說,prototype的方法相對this來說,更加高效。
第二步作內存占用的測試,把total.push(c);這行的注釋去掉,之所以要把它們加入到數組里面去,防止創(chuàng)建的時候,對象比較多的時候,沒有被引用的對象被GC了。結果發(fā)現差距不是一般的大,第一種方法要占用二三十M的內存,而第二種只需要一百多K。
成因推斷:
在處理這兩種代碼的時候,第一種,JS的解析器,給每個對象都創(chuàng)建一個單獨的方法,這樣增加了內存的開銷,同時創(chuàng)建方法的時候,增加了運行時間。第二種,JS的解析器和大部分的OOP編譯器一樣的,把對象的數據段和方法段分開存儲了,對于對象的私有數據,則是每個對象一份,而這些方法,則是放在公共的方法段里,所以可以減少運行時間和內存的開銷。
function Class1()
{
this.onclick = function(e)
{
for (var i=0; i < 1000; i++)
{
var a = new Date();
}
}
}
使用this.的方法可以很靈活地給對象添加屬性和方法,而且和大部分的OOP語言都相似,甚至在運行中都可以添加。
第二種:使用prototype關鍵字
function clickFunc(e)
{
for (var i=0; i < 1000; i++)
{
var a = new Date();
}
}
function Class2()
{
}
Class2.prototype.onclick = clickFunc;
這種用法上來講就沒有第一種顯得靈活。不過在一個對象new出來之前,也是一樣可以隨時添加一個對象的屬性和方法。
可是他們并不是相等的,相對來說,我更喜歡第一種,因為第一種方法相對比較集中,比較容易閱讀代碼。但是在運行的時候,他們運行的效率卻差別相當地大。以下讓我們看一下測試代碼吧:
var total = new Array();
function Test1()
{
var a = new Date();
for (var i=0; i < 10000; i++)
{
var c = new Class1();
//total.push(c);
}
var b = new Date();
alert(b.getTime()-a.getTime());
}
function Test2()
{
var a = new Date();
for (var i=0; i < 10000; i++)
{
var c = new Class2();
//total.push(c);
}
var b = new Date();
alert(b.getTime()-a.getTime());
}
第一步作執(zhí)行時間的測試:發(fā)現Test1()需要142ms,而Test2()僅需50ms.發(fā)現時間效率上來說,prototype的方法相對this來說,更加高效。
第二步作內存占用的測試,把total.push(c);這行的注釋去掉,之所以要把它們加入到數組里面去,防止創(chuàng)建的時候,對象比較多的時候,沒有被引用的對象被GC了。結果發(fā)現差距不是一般的大,第一種方法要占用二三十M的內存,而第二種只需要一百多K。
成因推斷:
在處理這兩種代碼的時候,第一種,JS的解析器,給每個對象都創(chuàng)建一個單獨的方法,這樣增加了內存的開銷,同時創(chuàng)建方法的時候,增加了運行時間。第二種,JS的解析器和大部分的OOP編譯器一樣的,把對象的數據段和方法段分開存儲了,對于對象的私有數據,則是每個對象一份,而這些方法,則是放在公共的方法段里,所以可以減少運行時間和內存的開銷。
相關文章
javascript最常用與實用的創(chuàng)建類的代碼
組合構造函數模式和原型模式2010-08-08javascript 面向對象編程 function是方法(函數)
在進行編程時,必免不了要碰到復雜的功能。初學者最怕復雜的功能,因為不能夠很好的進行功能邊界劃分,只能一大串if、循環(huán)加case堆疊在一起,結果出來的程序自己看著暈,別人看著更暈。2009-09-09JavaScript為對象原型prototype添加屬性的兩種方式
為對象原型prototype添加屬性的的方法, 需要的朋友可以參考下。2010-08-08