JavaScript物件導向之靜態與非靜態類

來源:互聯網
上載者:User

直到有那麼一天,我開始在js中拼湊DOM標籤,而且需要不停的拼湊,我發現My Code變得愈發的醜陋,不僅上是代碼簡潔的問題,甚至有時候還引發了效能問題。長此以往,不出三個月,上帝都將會不知道我寫過些什麼,本篇的目的完全出於記錄使用心得。
首先,還是來看一下促使我改變書寫JavaScript習慣的垃圾代碼,在練習、測試、調試、甚至正式項目中,大量的充斥著下面的代碼。 複製代碼 代碼如下:Function finduser(userId)
{
}
Function showmessage(msg)
{
Var message=”提示,出錯了,錯誤原因”+msg;
Alert(message);
}
Function append(obj)
{
Var onclick=”createdom()”;
Var title=”你好”;
$(obj).append(“<a href='javascript:void(0)' onclick='”+onclick+”' title='”+title+”'>”+title+”</a>”);
}

不要告訴我你沒有見過上面的代碼,說實話,上面的代碼確實寫得快,調用簡單,如果前兩個函數還不足以引發你的憤慨,那麼第三個函數應該讓你有點想問候寫這代碼建立者的衝動了。是的,第三個函數直接觸發了我決定使用物件導向。
實際上,我完全可以把第三個函數改造成下面這樣。 複製代碼 代碼如下:function append(obj)
{
var a=document.craeteElement(“a”);
a.title=”你好”;
a.href=”javascript:void(0);”;
a.innerHTML=a.title;
a.click=function(){createdom();};
$(obj).append(a);
}

這樣如何?有進步吧,好,這就是我想要的代碼,但是還不夠簡潔。我希望可以把建立DOM對象封裝到一個類中,並且把以上的三個方法都裝到一個對象中;那好吧,動手起來是很簡單的事情,這種工作不需要上網搜尋代碼和樣本的,直接應用C#的物件導向思維就可以完成。
首先是封裝以上的三個方法到一個對象中,封裝很簡單,應該不用我多廢話的,直接上代碼。

封裝後的三個函數 複製代碼 代碼如下:User={
Function finduser(userId)
{
},
Function showmessage(msg)
{
Var message=”提示,出錯了,錯誤原因”+msg;
Alert(message);
},
Function append(obj)
{
Var a=document.craeteElement(“a”);
a.title=”你好”;
a.href=”javascript:void(0);”;
a.innerHTML=a.title;
a.click=function(){createdom();};
$(obj).append(a);
}
}

只需要聲明一個User變數來儲存上面的三個方法即可,不同的方法間使用逗號分隔,需要注意的是,這時候的User是一個靜態類,無建構函式或者建構函式私人(我猜的),反正不可new了。
其次,我再建立一個封裝建立DOM對象的靜態類,代碼如下:

複製代碼 代碼如下:createElement={
element=function(targetName){return document.createElement(targetName);},
a=document. createElement(“a”)
}

相當簡單,這樣我就可以測試一下上面的CreateElement對象是否可正常工作,這次測試是在append方法中進行測試。append方法再次被改造成下面的代碼。

複製代碼 代碼如下:function append(obj)
{
Var a= createElement .a;
a.title=”你好”;
a.href=”javascript:void(0);”;
a.innerHTML=a.title;
a.click=function(){createdom();};
$(obj).append(a);
}

目前看來,append工作得相當的良好,好吧,我需要作出一點小改動,我需要在append函數中建立三個a並把它依次添加到obj對象中,代碼如下:

代碼 複製代碼 代碼如下:function append(obj)
{
For(i=0;i<3;i++)
{
Var a= createElement .a;
a.title=”你好”;
a.href=”javascript:void(0);”;
a.innerHTML=a.title;
a.click=function(){createdom();};
$(obj).append(a);
}
}

最後顯示的結果是obj對象中只得到了一個a我十分的不理解,這一個a讓我覺得我又回到了C#的懷抱,多麼美好呀,經過分析,當我通過Var a= CreateElement .a;
第一次調用在CreateElement.a來擷取a對象時,a屬性中的document.createElement(“a”)就已經把a對象駐留到記憶體中,這之後不管我再怎麼調用CreateElement.a,實際上都只是得到了記憶體中a的一個引用,改變的都竟然是同一個對象,這就是靜態類的特別之處,但是,當我通過調用CreateElement.element函數來擷取對象時,每次我得到的都是一個新的對象,方法不會儲存對象的引用,這是肯定的,解決方案就是通過調用CreateElement.element函數來建立新的對象,但是這種方法非物件導向推薦。
另外一種比較好的解決辦法是使用非靜態類,即實體類的方式,建立非靜態類的方式也是相當的簡單,代碼如下:

複製代碼 代碼如下:createElement=function(){
element=function(targetName){return document.createElement(targetName);};
a=document. createElement(“a”);
}

直接聲明createElement對象,並使之有建構函式,成員間以分號進行分隔,當然如果你喜歡,還可以直接這樣寫,也是沒有一樣的效果。

複製代碼 代碼如下:function createElement (){
element=function(targetName){return document.createElement(targetName);};
a=document. createElement(“a”);
}

經過上面的聲明,我們就可以在append函數中像C#一樣使用createElement類來建立DOM對象了。

函數 複製代碼 代碼如下:function append(obj)
{
for(i=0;i<3;i++)
{
var ele=new createElement();
var a=ele.a;
a.title=”你好”;
a.href=”javascript:void(0);”;
a.innerHTML=a.title;
a.click=function(){createdom();};
$(obj).append(a);
}
}

這樣每次new createElement()都是一個新的對象,不存在引用的問題了。
實際上,上面提到的就是Javascript中靜態類和非靜態類的區別;當然也從中得知,使用靜態類非靜態類的效率上還是有些差別的,而且調用的時候肯定也是靜態類方便一些,如果不計較引用衝突問題,我覺得靜態類應該是首選的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.