亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

解讀JavaScript中類的實現

2024-09-06 12:41:09
字體:
來源:轉載
供稿:網友
在JavaScript中可以使用function關鍵字來定義一個“類”,如何為類添加成員。在函數內通過this指針引用的變量或者方法都會成為類的成員,例如:

function class1(){
 var s="abc";
 this.p1=s;
 this.method1=function(){
  alert("this is a test method");
 }
}
var obj1=new class1();

  通過new class1()獲得對象obj1,對象obj1便自動獲得了屬性p1和方法method1。

  在JavaScript中,function本身的定義就是類的構造函數,結合前面介紹過的對象的性質以及new操作符的用法,下面介紹使用new創建對象的過程。

  (1)當解釋器遇到new操作符時便創建一個空對象;

  (2)開始運行class1這個函數,并將其中的this指針都指向這個新建的對象;

 ?。?)因為當給對象不存在的屬性賦值時,解釋器就會為對象創建該屬性,例如在class1中,當執行到this.p1=s這條語句時,就會添加一個屬性p1,并把變量s的值賦給它,這樣函數執行就是初始化這個對象的過程,即實現構造函數的作用;

 ?。?)當函數執行完后,new操作符就返回初始化后的對象。

  通過這整個過程,JavaScript中就實現了面向對象的基本機制。由此可見,在JavaScript中,function的定義實際上就是實現一個對象的構造器,是通過函數來完成的。這種方式的缺點是:

  ·將所有的初始化語句、成員定義都放到一起,代碼邏輯不夠清晰,不易實現復雜的功能。

  ·每創建一個類的實例,都要執行一次構造函數。構造函數中定義的屬性和方法總被重復的創建,例如:

this.method1=function(){
 alert("this is a test method");
}


  這里的method1每創建一個class1的實例,都會被創建一次,造成了內存的浪費。下一節介紹另一種類定義的機制:prototype對象,可以解決構造函數中定義類成員帶來的缺點。

 使用prototype對象定義類成員

  上一節介紹了類的實現機制以及構造函數的實現,現在介紹另一種為類添加成員的機制:prototype對象。當new一個function時,該對象的成員將自動賦給所創建的對象,例如:

 

<script language="JavaScript" type="text/javascript">
<!--
 //定義一個只有一個屬性prop的類
 function class1(){
  this.prop=1;
 }
 //使用函數的prototype屬性給類定義新成員
 class1.prototype.showProp=function(){
  alert(this.prop);
 }
 //創建class1的一個實例
 var obj1=new class1();
 //調用通過prototype原型對象定義的showProp方法
 obj1.showProp();
//-->
</script>

  prototype是一個JavaScript對象,可以為prototype對象添加、修改、刪除方法和屬性。從而為一個類添加成員定義。

  了解了函數的prototype對象,現在再來看new的執行過程。

 ?。?)創建一個新的對象,并讓this指針指向它;

  (2)將函數的prototype對象的所有成員都賦給這個新對象;

  (3)執行函數體,對這個對象進行初始化操作;

 ?。?)返回(1)中創建的對象。

  和上一節介紹的new的執行過程相比,多了用prototype來初始化對象的過程,這也和prototype的字面意思相符,它是所對應類的實例的原型。這個初始化過程發生在函數體(構造器)執行之前,所以可以在函數體內部調用prototype中定義的屬性和方法,例如:

<script language="JavaScript" type="text/javascript">
<!--
//定義一個只有一個屬性prop的類
function class1(){
 this.prop=1;
 this.showProp();
}
//使用函數的prototype屬性給類定義新成員
class1.prototype.showProp=function(){
 alert(this.prop);
}
//創建class1的一個實例
var obj1=new class1();
//-->
</script>

  和上一段代碼相比,這里在class1的內部調用了prototype中定義的方法showProp,從而在對象的構造過程中就彈出了對話框,顯示prop屬性的值為1。

  需要注意,原型對象的定義必須在創建類實例的語句之前,否則它將不會起作用,例如:

<script language="JavaScript" type="text/javascript">
<!--
//定義一個只有一個屬性prop的類
function class1(){
 this.prop=1;
 this.showProp();
}
//創建class1的一個實例
var obj1=new class1();
//在創建實例的語句之后使用函數的prototype屬性給類定義新成員,只會對后面創建的對象有效
class1.prototype.showProp=function(){
 alert(this.prop);
}
//-->
</script>

  這段代碼將會產生運行時錯誤,顯示對象沒有showProp方法,就是因為該方法的定義是在實例化一個類的語句之后。

  由此可見,prototype對象專用于設計類的成員,它是和一個類緊密相關的,除此之外,prototype還有一個重要的屬性:constructor,表示對該構造函數的引用,例如:

function class1(){
 alert(1);
}
class1.prototype.constructor(); //調用類的構造函數

  這段代碼運行后將會出現對話框,在上面顯示文字“1”,從而可以看出一個prototype是和一個類的定義緊密相關的。實際上:class1.prototype.constructor===class1。

 一種JavaScript類的設計模式

  前面已經介紹了如何定義一個類,如何初始化一個類的實例,且類可以在function定義的函數體中添加成員,又可以用prototype定義類的成員,編程的代碼顯得混亂。如何以一種清晰的方式來定義類呢?下面給出了一種類的實現模式。

  在JavaScript中,由于對象靈活的性質,在構造函數中也可以為類添加成員,在增加靈活性的同時,也增加了代碼的復雜度。為了提高代碼的可讀性和開發效率,可以采用這種定義成員的方式,而使用prototype對象來替代,這樣function的定義就是類的構造函數,符合傳統意義類的實現:類名和構造函數名是相同的。例如:

 

function class1(){
 //構造函數
}
//成員定義
class1.prototype.someProperty="sample";
class1.prototype.someMethod=function(){
 //方法實現代碼
}

  雖然上面的代碼對于類的定義已經清晰了很多,但每定義一個屬性或方法,都需要使用一次class1.prototype,不僅代碼體積變大,而且易讀性還不夠。為了進一步改進,可以使用無類型對象的構造方法來指定prototype對象,從而實現類的成員定義:

//定義一個類class1
function class1(){
 //構造函數
}
//通過指定prototype對象來實現類的成員定義
class1.prototype={
 someProperty:"sample", someMethod:function(){
  //方法代碼
 },
 …//其他屬性和方法.
}

  上面的代碼用一種很清晰的方式定義了class1,構造函數直接用類名來實現,而成員使用無類型對象來定義,以列表的方式實現了所有屬性和方法,并且可以在定義的同時初始化屬性的值。這也更象傳統意義面向對象語言中類的實現。只是構造函數和類的成員定義被分為了兩個部分,這可看成JavaScript中定義類的一種固定模式,這樣在使用時會更加容易理解。

  注意:在一個類的成員之間互相引用,必須通過this指針來進行,例如在上面例子中的someMethod方法中,如果要使用屬性someProperty,必須通過this.someProperty的形式,因為在JavaScript中每個屬性和方法都是獨立的,它們通過this指針聯系在一個對象上。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本精品久久久久久久| 国产成人小视频在线观看| 久久精品中文字幕| 国产精品香蕉av| 亚洲成人激情在线| 亚洲国产欧美一区二区丝袜黑人| 色无极亚洲影院| 亚洲自拍偷拍区| 久久久综合免费视频| 久久精品亚洲热| 中文字幕精品一区二区精品| 日本一区二区三区在线播放| 成人福利在线观看| 97在线视频免费播放| 精品自在线视频| 久热精品视频在线免费观看| 狠狠躁18三区二区一区| 欧美午夜激情小视频| 91深夜福利视频| 欧美国产极速在线| 国产精品久久久久久久久| 18久久久久久| 国产mv免费观看入口亚洲| 69av在线视频| 精品久久久久久久久久久久久久| 欧美性xxxx极品高清hd直播| 91精品免费视频| 久久好看免费视频| 亚洲人成在线播放| 国产精品免费视频xxxx| 久久精品国产久精国产一老狼| 九九久久久久99精品| 成人黄色av网| 国产亚洲福利一区| 久久精品99久久久久久久久| 亚洲精品日韩在线| 国产精品国产自产拍高清av水多| 国产亚洲精品久久久久久| 亚洲综合国产精品| 欧美视频二区36p| 欧美巨乳在线观看| 91精品久久久久久久久久另类| 日韩免费在线播放| 国产欧美欧洲在线观看| 国产婷婷色综合av蜜臀av| 亚洲第一精品夜夜躁人人躁| 国产精品视频在线播放| 日韩电影免费在线观看中文字幕| 91精品国产91| 国产精品一区二区性色av| 欧美一级视频免费在线观看| 欧美xxxx做受欧美| 国产精品久久视频| 久久综合网hezyo| 国产精品美女久久久免费| 国产精品扒开腿做爽爽爽的视频| 2020久久国产精品| 国产精品欧美激情在线播放| 久久综合伊人77777尤物| 美女视频久久黄| 日韩精品视频中文在线观看| 欧美高清视频在线播放| 国产精品69精品一区二区三区| 亚洲欧美激情在线视频| 亚洲一区二区久久久久久久| 欧美日韩在线看| 欧美激情第6页| 色悠悠久久88| 亚洲第一区中文99精品| 成人网在线免费观看| 久久99热精品这里久久精品| 狠狠操狠狠色综合网| 在线中文字幕日韩| 亚洲最大成人网色| 国产精品久久久久久久久久久不卡| 亚洲色图色老头| 亚洲丝袜在线视频| 国产精品久久久久aaaa九色| 亚洲国产天堂久久综合| 亚洲自拍中文字幕| 欧美激情免费视频| 成人h视频在线观看播放| 成人在线播放av| 亚洲石原莉奈一区二区在线观看| 国产精品一区电影| 欧美亚洲一区在线| 欧美大奶子在线| 亚洲国产成人精品久久久国产成人一区| 亚洲视频在线免费观看| 亚洲免费中文字幕| 不卡av在线网站| 亚洲成成品网站| 欧美亚洲在线播放| 久久综合伊人77777蜜臀| 中文字幕av一区中文字幕天堂| 久久99国产精品久久久久久久久| 好吊成人免视频| 久久香蕉国产线看观看av| 国产精品久久久久久超碰| 国产精品福利网| 国产一区二中文字幕在线看| 欧美亚洲国产视频| 亚洲欧美日韩天堂一区二区| 成人激情视频小说免费下载| 欧美黄色小视频| 亚洲精品v天堂中文字幕| 中文字幕免费精品一区高清| 亚洲国产精彩中文乱码av| 综合久久五月天| 欧美性在线观看| 久久中文字幕视频| 国产精品久久av| 91久久精品国产91性色| 国产视频综合在线| 亚洲最大的网站| 亚洲电影中文字幕| 久久久久久久香蕉网| 九色成人免费视频| 欧美人与性动交| 国产精品中文在线| 91精品视频在线播放| 精品中文字幕乱| 欧美成人免费全部观看天天性色| 国产一区私人高清影院| 97视频在线观看亚洲| 色狠狠久久aa北条麻妃| 91九色蝌蚪国产| 91久久久在线| 国产精品久久久久久久app| 亚洲自拍偷拍在线| 亚洲第一视频在线观看| 亚洲视频在线免费观看| 国产成人在线精品| 久久成年人视频| 亚洲欧洲午夜一线一品| 亚洲欧美在线免费观看| 欧洲中文字幕国产精品| 黄色成人av在线| 久久亚洲国产成人| 色偷偷亚洲男人天堂| 中文字幕亚洲欧美| 欧美日韩激情小视频| 成人淫片在线看| 久久久久日韩精品久久久男男| 欧美日韩国产在线看| 欧美国产精品人人做人人爱| 亚洲伊人第一页| 久久久亚洲福利精品午夜| 国产一区二区三区久久精品| 国产精品中文字幕在线| 亚洲精品在线视频| 亚洲综合自拍一区| 久久婷婷国产麻豆91天堂| 精品久久久香蕉免费精品视频| 色综合久久88| 狠狠爱在线视频一区| 国产精品视频1区| 日韩在线观看网站| 欧美在线视频一区二区| 91久久精品国产91久久性色| 日韩电影中文字幕一区| 精品视频中文字幕| 国产精品吹潮在线观看| 国产精品女人网站|