JavaScript面向?qū)ο蟮膬煞N書寫方法以及差別
javascript中的對(duì)象js作為一種動(dòng)態(tài)語言,在語法上有相當(dāng)大的自由度,所以造成了一種功能,有n種寫法的局面。
在js中實(shí)現(xiàn)oop,一般來說有兩種方法:
第一種:使用this關(guān)鍵字
function class1()
{
this.onclick = function(e)
{
for (var i=0; i < 1000; i++)
{
var a = new date();
}
}
}
使用this.的方法可以很靈活地給對(duì)象添加屬性和方法,而且和大部分的oop語言都相似,甚至在運(yùn)行中都可以添加。
第二種:使用prototype關(guān)鍵字
function clickfunc(e)
{
for (var i=0; i < 1000; i++)
{
var a = new date();
}
}
function class2()
{
}
class2.prototype.onclick = clickfunc;
這種用法上來講就沒有第一種顯得靈活。不過在一個(gè)對(duì)象new出來之前,也是一樣可以隨時(shí)添加一個(gè)對(duì)象的屬性和方法。
可是他們并不是相等的,相對(duì)來說,我更喜歡第一種,因?yàn)榈谝环N方法相對(duì)比較集中,比較容易閱讀代碼。但是在運(yùn)行的時(shí)候,他們運(yùn)行的效率卻差別相當(dāng)?shù)卮?。以下讓我們看一下測(cè)試代碼吧:
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í)行時(shí)間的測(cè)試:發(fā)現(xiàn)test1()需要142ms,而test2()僅需50ms.發(fā)現(xiàn)時(shí)間效率上來說,prototype的方法相對(duì)this來說,更加高效。
javascript的對(duì)象第二步作內(nèi)存占用的測(cè)試,把total.push(c);這行的注釋去掉,之所以要把它們加入到數(shù)組里面去,防止創(chuàng)建的時(shí)候,對(duì)象比較多的時(shí)候,沒有被引用的對(duì)象被gc了。結(jié)果發(fā)現(xiàn)差距不是一般的大,第一種方法要占用二三十m的內(nèi)存,而第二種只需要一百多k。
javascript創(chuàng)建對(duì)象
成因推斷:
在處理這兩種代碼的時(shí)候,第一種,js的解析器,給每個(gè)對(duì)象都創(chuàng)建一個(gè)單獨(dú)的方法,這樣增加了內(nèi)存的開銷,同時(shí)創(chuàng)建方法的時(shí)候,增加了運(yùn)行時(shí)間。第二種,js的解析器和大部分的oop編譯器一樣的,把對(duì)象的數(shù)據(jù)段和方法段分開存儲(chǔ)了,對(duì)于對(duì)象的私有數(shù)據(jù),則是每個(gè)對(duì)象一份,而這些方法,則是放在公共的方法段里,所以可以減少運(yùn)行時(shí)間和內(nèi)存的開銷。
在js中實(shí)現(xiàn)oop,一般來說有兩種方法:
第一種:使用this關(guān)鍵字
function class1()
{
this.onclick = function(e)
{
for (var i=0; i < 1000; i++)
{
var a = new date();
}
}
}
使用this.的方法可以很靈活地給對(duì)象添加屬性和方法,而且和大部分的oop語言都相似,甚至在運(yùn)行中都可以添加。
第二種:使用prototype關(guān)鍵字
function clickfunc(e)
{
for (var i=0; i < 1000; i++)
{
var a = new date();
}
}
function class2()
{
}
class2.prototype.onclick = clickfunc;
這種用法上來講就沒有第一種顯得靈活。不過在一個(gè)對(duì)象new出來之前,也是一樣可以隨時(shí)添加一個(gè)對(duì)象的屬性和方法。
可是他們并不是相等的,相對(duì)來說,我更喜歡第一種,因?yàn)榈谝环N方法相對(duì)比較集中,比較容易閱讀代碼。但是在運(yùn)行的時(shí)候,他們運(yùn)行的效率卻差別相當(dāng)?shù)卮?。以下讓我們看一下測(cè)試代碼吧:
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í)行時(shí)間的測(cè)試:發(fā)現(xiàn)test1()需要142ms,而test2()僅需50ms.發(fā)現(xiàn)時(shí)間效率上來說,prototype的方法相對(duì)this來說,更加高效。
javascript的對(duì)象第二步作內(nèi)存占用的測(cè)試,把total.push(c);這行的注釋去掉,之所以要把它們加入到數(shù)組里面去,防止創(chuàng)建的時(shí)候,對(duì)象比較多的時(shí)候,沒有被引用的對(duì)象被gc了。結(jié)果發(fā)現(xiàn)差距不是一般的大,第一種方法要占用二三十m的內(nèi)存,而第二種只需要一百多k。
javascript創(chuàng)建對(duì)象
成因推斷:
在處理這兩種代碼的時(shí)候,第一種,js的解析器,給每個(gè)對(duì)象都創(chuàng)建一個(gè)單獨(dú)的方法,這樣增加了內(nèi)存的開銷,同時(shí)創(chuàng)建方法的時(shí)候,增加了運(yùn)行時(shí)間。第二種,js的解析器和大部分的oop編譯器一樣的,把對(duì)象的數(shù)據(jù)段和方法段分開存儲(chǔ)了,對(duì)于對(duì)象的私有數(shù)據(jù),則是每個(gè)對(duì)象一份,而這些方法,則是放在公共的方法段里,所以可以減少運(yùn)行時(shí)間和內(nèi)存的開銷。
相關(guān)文章
- ASP怎么談到應(yīng)用到類的?
- 檢測(cè)函數(shù) asp class
- 遭遇ASP類的事件設(shè)計(jì)
- ASP高亮類
- Object對(duì)象的一些的隱藏函數(shù)介紹
- 淺談ASP中的類
- 在VBScript中使用類
- ASP 類專題
- 代碼與頁(yè)面的分離
- ASP代碼的對(duì)象化
- 一個(gè)asp快速字符串連接類
- 一個(gè)簡(jiǎn)單的asp數(shù)據(jù)庫(kù)操作類
- ASP類編寫詳細(xì)說明
- 實(shí)現(xiàn)支持邏輯搜索/單詞搜索/詞組搜索+支持OR/AND關(guān)鍵字的VBS CLASS!
- ASP類Class入門 推薦
- 創(chuàng)建一個(gè)ASP通用分頁(yè)類
- 如何編寫一個(gè)ASP類
- 一個(gè)ACCESS數(shù)據(jù)庫(kù)訪問的類第1/3頁(yè)
- 分頁(yè)類,異常類
- ASP 類 Class入門