javascript
javascript中类的定义和使用{转载}
本文轉(zhuǎn)載自:http://www.cnblogs.com/klesh/archive/2007/09/28/understanding-classs-definition-in-javascript.html
關(guān)于如何在Javascript中定義類,網(wǎng)上可以找到不少的文章。在開(kāi)始講之前,還是先來(lái)看看定義類的兩種基本方式吧:
(1) 利用函數(shù)構(gòu)造類型。
function Foo(text, url) {this.text = text;this.url = url;this.render = function() {document.write('<a href="' + this.url + '">' + this.text + '</a>');} } (2) 利用原型prototype。function Bar(text, url) {this.text = text;this.url = url; } Bar.prototype = {render : function() {document.write('<a href="' + this.url + '">' + this.text + '</a>');} }代碼并不復(fù)雜,相信大多數(shù)人看完之后都會(huì)曉得怎么使用了。但是當(dāng)我第一次看到這種類的定義方式的時(shí)候覺(jué)得很奇怪,很長(zhǎng)一段時(shí)間里都是知其然而不知其所以然。如果你有和我一樣的困惑,也許可以分享一下我的一點(diǎn)經(jīng)驗(yàn)。
先來(lái)看看怎么使用定義好的類型,
var a = new Foo('Link A', 'http://www.cnblogs.com'); var b = new Bar('Link B', 'http://www.csdn.net'); a.render(); b.render();跟很多面向?qū)ο笳Z(yǔ)言(如C#)的使用方法一樣,都是使用new關(guān)鍵字實(shí)例化類,而且當(dāng)你用instanceof來(lái)測(cè)試它們是不是相應(yīng)類型時(shí),都可以得到預(yù)望的答案。兩種不同方式定義出來(lái)的類型Foo和Bar很多時(shí)候使用起來(lái)并沒(méi)有什么不同。
但它們?cè)谠砩鲜峭耆煌?#xff0c;方式1,是在構(gòu)造函數(shù)中動(dòng)態(tài)中創(chuàng)建類的成員,這就意味著每個(gè)Foo的實(shí)例它們的render方法其實(shí)是兩個(gè)完全獨(dú)立的函數(shù);而方式2,則是通過(guò)原型prototype的方式將類的共享成員與類的實(shí)例綁定在一起,所以每個(gè)Bar實(shí)例的render方法都是指向同一個(gè)方法,它是靜態(tài)的。請(qǐng)看以下代碼:
document.write(Object.prototype==String.prototype); var c = new Foo('Link C', 'http://www.asp.net'); document.write(c.render == a.render); // false var d = new Bar('Link D', 'http://www.klesh.cn); document.write(d.render == b.render); // trueFoo在實(shí)例化后就是一個(gè)獨(dú)立的個(gè)體,它的任何改動(dòng)不會(huì)影響到原來(lái)的類型定義,也不會(huì)影響到其他的實(shí)例;而B(niǎo)ar則不同,它的所有實(shí)例都依然受prototype的影響,通過(guò)對(duì)Bar.prototype的修改或擴(kuò)展,可以影響到所有包括已經(jīng)實(shí)例化的實(shí)例。回過(guò)頭來(lái)看Foo,由于它的成員,特別是成員函數(shù)是動(dòng)態(tài)創(chuàng)建的,利用閉包,則可以模擬面向?qū)ο笾械摹八接谐蓡T”,這一點(diǎn)內(nèi)容會(huì)很長(zhǎng),稍后有時(shí)間再和大家分享。
兩種方式各有特點(diǎn)。但是最后,嚴(yán)格來(lái)說(shuō),無(wú)論什么方式,都只能說(shuō)是“模擬自定義類型”,因?yàn)樵诨趯?duì)象的Javascript中,它事實(shí)上是沒(méi)有原生的“自定義類型”的概念的(這一點(diǎn)也很長(zhǎng),暫不細(xì)說(shuō))。
最后推薦大家一般使用方式2來(lái)在Javascript模擬自定義類,一來(lái),速度上會(huì)比較快,而且還可以通過(guò)prototype對(duì)類型進(jìn)行修改,除非你有需要到“私有成員”(好像也有人叫“閉包“)……除非你有需要用到閉包來(lái)模擬“私有成員”。
刪除線和斜體部分根據(jù)木野狐同志的意見(jiàn)修正。
轉(zhuǎn)載于:https://www.cnblogs.com/chenxizhang/archive/2010/01/02/1638008.html
總結(jié)
以上是生活随笔為你收集整理的javascript中类的定义和使用{转载}的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: window系统下的堆栈溢出 作者:ip
- 下一篇: 格密码教程(六):高斯二维格规约,解决S