<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • JavaScript中的類Class詳細介紹

    時間:2024-09-07 19:34:54 JavaScript 我要投稿
    • 相關推薦

    關于JavaScript中的類Class詳細介紹

      在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

    【JavaScript中的類Class詳細介紹】相關文章:

    perl- javascript中class的機制05-03

    有關深入理解JavaScript中的并行處理的介紹10-14

    JavaScript中的with關鍵字07-24

    在Java中執行JavaScript代碼07-14

    Javascript中typeof 用法歸納09-27

    抽象語法樹在JavaScript中的應用08-18

    JavaScript中的三種對象10-24

    JavaScript數組常用方法介紹09-04

    javascript克隆對象深度介紹07-25

    JavaScript中push(),join() 函數實例詳解09-05

    主站蜘蛛池模板: 久久久精品国产亚洲成人满18免费网站 | 精品性影院一区二区三区内射| 999精品在线| 亚洲国产精品无码久久久久久曰 | 精品国产一区二区22| 国产精品无圣光一区二区 | 精品国产AⅤ一区二区三区4区| 国内精品久久久久| 精品久久久久久亚洲精品| 真实国产精品vr专区| 欧美精品在线免费| 国产乱人伦精品一区二区在线观看| 精品国产日产一区二区三区| 国产午夜精品无码| 久久99热只有频精品8| 在线亚洲精品福利网址导航| 久久99精品国产99久久6| 99久免费精品视频在线观看| 国产亚洲综合成人91精品| 国产日韩精品欧美一区喷水| 无码人妻精品一区二区三区66 | 香港三级精品三级在线专区| 久久99精品国产麻豆蜜芽| 国产线视频精品免费观看视频| 国产高清在线精品一本大道| 热久久国产精品| 四虎成人欧美精品在永久在线 | 久久久国产乱子伦精品作者| 自拍中文精品无码| 亚洲精品美女久久777777| 亚洲国产精品va在线播放| 亚洲AV无码久久精品成人 | 狠狠精品久久久无码中文字幕| 99热都是精品久久久久久| 999国产精品色在线播放| 高清在线国产午夜精品| 国产精品无码免费播放| 久久亚洲中文字幕精品一区四| 欧美成人精品高清视频在线观看 | 一本一本久久A久久综合精品| 尤物yw午夜国产精品视频|