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

首頁 > 編程 > JavaScript > 正文

JavaScript中的類(Class)詳細介紹

2019-11-20 13:33:46
字體:
來源:轉載
供稿:網友

在JavaScript中,可以使用類(Class)來實現面向對象編程(Object Oriented Programming)。不過,JavaScript中的類與Java中的有所不同,其相應的定義和使用也不一樣。

JavaScript中類的定義

在JavaScript中,所有從同一個原型對象(prototype)處衍生出來的對象組成了一個類;也就是說,JavaScript中的類是一個對象集合的概念,如果兩個對象它們的prototype相同,那么它們就屬于同一個類;JavaScript中的類甚至都不需要類名。以下面的代碼為例:

復制代碼 代碼如下:

var p = {x:42};
var a = Object.create(p);
var b = Object.create(p);
console.log(a === b);//false
console.log(Object.getPrototypeOf(a) === Object.getPrototypeOf(b));//true

在上述例子中,對象a和b擁有相同的原型對象(prototype) p,因此a和b屬于同一個類(雖然這個類都沒有類名),它們從原型對象p處繼承了值為42的屬性x。

從這個例子中可以看到,原型對象的作用就相當于模板,可以由之衍生/創建出多個對象,其地位與Java語言中的類代碼(Class code)相同,是JavaScript中類定義的核心。以下這個例子中的原型對象就呈現出更像類代碼的樣子:


復制代碼 代碼如下:

var p = {
 INCREMENT_BY : 1,
 increment : function(x){
  return x + this.INCREMENT_BY;
 }
}
var a = Object.create(p);
var b = Object.create(p);
console.log(a.increment(7));//8
console.log(b.increment(9));//10


上述例子中,原型對象p定義了一個值為1的property (INCREMENT_BY)和一個名為increment的函數;對象a和b從p這個模板處獲取了INCREMENT_BY和increment函數。當調用對象a或b的increment函數時,JavaScript會試圖獲取a或b的INCREMENT_BY值(this.INCREMENT_BY);由于INCREMENT_BY是從p中獲取的,因此其值都是1 ― 從模板中獲取的,值都相同的變量,類似于Java中的靜態類變量(static variable),因此上面的例子中對INCREMENT_BY變量命名時使用了全大寫字符。

在上面的例子中,所有從模板p處創建出來的對象(屬于同一個類的這些對象),其屬性和行為都是一模一樣的。但實際上對于同一個類的不同對象,它們除了擁有類所定義的屬性/行為以外,往往具有一些自身所特有的屬性與行為。因此,如果需要將prototype這個模板當作類來使用的話,就必須對每一個從中衍生出來的對象進行一定的定制:


復制代碼 代碼如下:

var p = {
 INCREMENT_BY : 1,
 increment : function(x){
  return x + this.INCREMENT_BY + this.custom_increment_by;
 }
}
var a = Object.create(p);
var b = Object.create(p);
a.custom_increment_by = 0;
b.custom_increment_by = 1;
console.log(a.increment(7));//8
console.log(b.increment(9));//11


在這個例子中,從模板p處創建出來的對象a和b擁有一個彼此間值不一定相等的變量custom_increment_by,而它們的increment()函數這個行為的最終結果則與custom_increment_by的值相關。一般來說,對新建對象進行定制化的工作往往放在統一的函數中進行:


復制代碼 代碼如下:

var p = {
 INCREMENT_BY : 1,
 increment : function(x){
  return x + this.INCREMENT_BY + this.custom_increment_by;
 }
}
function getIncrementalClassObject(customIncrementByValue){
 var incrementalObj = Object.create(p);
 incrementalObj.custom_increment_by = customIncrementByValue;
 return incrementalObj;
}
var a = getIncrementalClassObject(0);
var b = getIncrementalClassObject(1);
console.log(a.increment(7));//8
console.log(b.increment(9));//11


如此,便通過原型對象p和getIncrementalClassObject()函數完成了一個類的定義:可以通過調用getIncrementalClassObject()函數來獲取原型對象都是p的對象,而在調用getIncrementalClassObject()函數過程中可以對這些新建對象進行一定的定制化。值得注意的是,此時這個已經定義了的類還沒有類名,為了方便描述,姑且稱之為Incremental。

回顧getIncrementalClassObject()函數中所做的工作,可以看到從Incremental這個類中創建新的對象所經歷的過程如下:

1.創建一個空對象,并將其原型對象定義為p。
2.根據不同的參數值,對這個新建的空對象進行定制。
3.返回已經定制完成的新對象。

在JavaScript中,可以通過使用Constructor(構造函數)來快速地完成類的定義以及新對象的創建。

JavaScript中的Constructor(構造函數)

從上述Incremental類這個例子中可以看到,定義新的類需要兩部分代碼:創建原型對象作為模板、創建自定義函數對新對象進行初始化;而從類中創建新的對象則經歷了三個過程:指定新對象的原型對象、定制/初始化新對象、返回這個新對象。在JavaScript中,這一切都可以通過Constructor(構造函數)來完成。

JavaScript中的Constructor是一個函數(function),承擔對新對象進行初始化的職責;而這個Constructor函數的prototype則作為模板用于創建新對象。仍以上述Incremental類為例,用Constructor來重寫代碼后是這樣的:


復制代碼 代碼如下:

function Incremental(customIncrementByValue){
  this.custom_increment_by = customIncrementByValue;
}
Incremental.prototype = {
  INCREMENT_BY : 1,
 increment : function(x){
  return x + this.INCREMENT_BY + this.custom_increment_by;
 }
}

var a = new Incremental(0);
var b = new Incremental(1);
console.log(a.increment(7));//8
console.log(b.increment(9));//11

通過new關鍵詞,使用Constructor函數來創建新對象這一過程,其實際上經歷了以下幾個階段:

創建一個新的空對象。

1.將這個對象的原型對象指向constructor函數的prototype屬性。
2.將這個對象作為this參數,執行constructor函數。
3.這與之前的getIncrementalClassObject()函數中所做的工作是一樣的。

類名

在使用Constructor創建對象時,相應的對象也就有了“類名”,這可以從instanceof操作符的結果上得到驗證:

復制代碼 代碼如下:

console.log(a instanceof Incremental);//true
console.log(b instanceof Incremental);//true

不過,instanceof操作符并不判斷對象是否由Incremental這一構造函數所創建,instanceof操作符只判斷對象的原型對象是否為Incremental.prototype。當存在兩個prototype一樣的構造函數時,instanceof操作符將統一返回true,而不會區分用于創建對象的構造函數到底是哪個。
復制代碼 代碼如下:

function Incremental2(customIncrementByValue){
  this.custom_increment_by = customIncrementByValue + 3;
}
Incremental2.prototype = Incremental.prototype;
console.log(a instanceof Incremental2);//true

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产盗摄xxxx视频xxx69| 日韩国产欧美精品在线| 欧美最顶级丰满的aⅴ艳星| 亚洲天堂视频在线观看| 亚洲精品成a人在线观看| 国产欧美精品在线| 欧美国产高跟鞋裸体秀xxxhd| 亚洲欧美日韩第一区| 97视频在线观看免费高清完整版在线观看| 亚洲精选一区二区| 欧美专区福利在线| 久久久久久久电影一区| 色悠悠国产精品| 日韩电影免费观看在线观看| 亚洲综合在线中文字幕| 国产亚洲欧美aaaa| 久久亚洲精品中文字幕冲田杏梨| 国产精品高清在线观看| 日韩av在线免播放器| 北条麻妃一区二区三区中文字幕| 午夜精品视频网站| 精品国产乱码久久久久酒店| 这里只有精品视频在线| 日韩在线观看你懂的| 精品久久久久久久久久| 国产精品露脸自拍| 国产精品99久久久久久人| 国产日韩一区在线| 久久亚洲国产精品成人av秋霞| 欧美激情国产精品| 欧美午夜美女看片| 欧美黄色片免费观看| 一夜七次郎国产精品亚洲| 91视频88av| 久久精品视频中文字幕| 欧美日韩一区免费| 色综合久久久久久中文网| 亚洲福利小视频| 中文字幕日韩欧美在线视频| 国内久久久精品| 日韩美女在线观看| 日韩一级裸体免费视频| 欧洲中文字幕国产精品| 精品日韩中文字幕| 国内精品一区二区三区四区| 国产欧美日韩精品在线观看| 美女福利视频一区| 亚洲成av人乱码色午夜| 国产欧美日韩精品在线观看| 日韩在线观看免费高清完整版| 欧美大码xxxx| 国产成人精品免高潮在线观看| 中文字幕一区二区三区电影| 日韩欧美亚洲范冰冰与中字| 欧美日韩精品国产| 久久久久久国产精品三级玉女聊斋| 久久久久久久久久国产| 亚洲香蕉成人av网站在线观看| 日韩第一页在线| 亚洲少妇激情视频| 国产网站欧美日韩免费精品在线观看| 国产精品观看在线亚洲人成网| 国产精品欧美一区二区| 国产狼人综合免费视频| 欧美日韩精品在线| 国产综合在线看| 欧美在线免费看| 国产激情久久久| 欧美日韩中文在线观看| 精品国偷自产在线视频| 欧美一区在线直播| 久久精品99久久香蕉国产色戒| 中文字幕九色91在线| 最近2019年中文视频免费在线观看| 高清欧美电影在线| 国产欧美日韩最新| 中文字幕精品www乱入免费视频| 久久久久久久久久国产精品| 亚洲第一区中文99精品| 国产日韩精品一区二区| 久久视频国产精品免费视频在线| xvideos亚洲人网站| 日韩经典中文字幕在线观看| 亚洲国产欧美久久| 日韩美女视频免费看| 国产91色在线| 成人性教育视频在线观看| 欧美成人亚洲成人日韩成人| 91九色在线视频| 午夜精品美女自拍福到在线| 亚州精品天堂中文字幕| 欧美性猛交xxxx富婆弯腰| 欧美国产日韩一区二区在线观看| 日韩av电影免费观看高清| 久久久精品一区二区| 国产精品视频99| 国产午夜精品免费一区二区三区| 亚洲人成电影网站色www| 美女视频黄免费的亚洲男人天堂| 欧美精品生活片| 日韩亚洲在线观看| 国产在线视频一区| 亚洲最大成人在线| 黄色成人在线播放| 精品亚洲一区二区三区在线播放| 91精品国产91| 成人激情黄色网| 欧美色videos| 美女国内精品自产拍在线播放| 久久男人av资源网站| 国产精品视频男人的天堂| 亚洲无av在线中文字幕| 91成人精品网站| 亚洲a级在线观看| 日韩欧美国产网站| 国产欧美日韩专区发布| 欧美极品少妇全裸体| 久久精品一本久久99精品| 韩国国内大量揄拍精品视频| 成人黄色大片在线免费观看| 亚洲欧美在线x视频| 2025国产精品视频| 亚洲精品综合久久中文字幕| 欧美黄色www| 98精品国产高清在线xxxx天堂| 亚洲国产精品嫩草影院久久| 伊人伊成久久人综合网站| www.xxxx精品| 国产精品久久久久久久久久免费| 日韩欧美aⅴ综合网站发布| 久久国产视频网站| 97欧美精品一区二区三区| 欧美高跟鞋交xxxxhd| 欧美孕妇毛茸茸xxxx| 欧美壮男野外gaytube| 国产精品ⅴa在线观看h| 国产精品夫妻激情| 亚洲第一二三四五区| 2020欧美日韩在线视频| 久久久久久噜噜噜久久久精品| 这里只有精品在线播放| 日韩视频精品在线| 久久香蕉国产线看观看av| 日韩美女av在线免费观看| 亚洲欧美国产精品va在线观看| 久久久久国产精品www| 成人精品网站在线观看| 91香蕉国产在线观看| 亚洲精品成a人在线观看| 日韩电影免费观看中文字幕| 日韩精品高清视频| 在线观看欧美日韩国产| 国产精品h片在线播放| 欧美孕妇毛茸茸xxxx| 欧美激情免费看| 日韩在线观看你懂的| 欧洲美女7788成人免费视频| 不用播放器成人网| 国内精品400部情侣激情| 国产精品爽黄69| 在线观看欧美日韩| 精品欧美激情精品一区| 中文字幕国产精品久久| 国产69精品99久久久久久宅男|