最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript ES6中CLASS的使用詳解

 更新時間:2016年11月22日 09:38:22   投稿:daisy  
class是es6引入的最重要特性之一。在沒有class之前,我們只能通過原型鏈來模擬類。這篇文章我們將詳細的介紹關(guān)于ES6中CLASS的使用,有需要的朋友們可以參考借鑒,下面來一起看看吧。

前言

對于javascript來說,類是一種可選(而不是必須)的設(shè)計模式,而且在JavaScript這樣的[[Prototype]] 語言中實現(xiàn)類是很蹩腳的。

這種蹩腳的感覺不只是來源于語法,雖然語法是很重要的原因。js里面有許多語法的缺點:繁瑣雜亂的.prototype 引用、試圖調(diào)用原型鏈上層同名函數(shù)時的顯式偽多態(tài)以及不可靠、不美觀而且容易被誤解成“構(gòu)造函數(shù)”的.constructor。

除此之外,類設(shè)計其實還存在更進一步的問題。傳統(tǒng)面向類的語言中父類和子類、子類和實例之間其實是復(fù)制操作,但是在[[Prototype]] 中并沒有復(fù)制。

對象關(guān)聯(lián)代碼和行為委托使用了[[Prototype]] 而不是將它藏起來,對比其簡潔性可以看出,類并不適用于JavaScript。

ES6中CLASS的使用

javascript傳統(tǒng)做法是當生成一個對象實例,需要定義構(gòu)造函數(shù),然后通過new的方式完成。

function StdInfo(){
  this.name = "job";      
  this.age = 30;      
}

StdInfo.prototype.getNames = function (){
  console.log("name:"+this.name);        
}
//得到一個學(xué)員信息對象
var p = new StdInfo()

javacript中只有對象,沒有類。它是是基于原型的語言,原型對象是新對象的模板,它將自身的屬性共享給新對象。這樣的寫法和傳統(tǒng)面向?qū)ο笳Z言差異很大,很容易讓新手感到困惑。

定義類

到了ES6添加了類,作為對象的模板。通過class來定義一個類:

//定義類
class StdInfo {
  constructor(){
    this.name = "job";      
    this.age = 30;   
  }
  //定義在類中的方法不需要添加function
  getNames(){
    console.log("name:"+this.name);   
  }
}
//使用new的方式得到一個實例對象
var p = new StdInfo();

上面的寫法更加清晰、更像面向?qū)ο缶幊痰恼Z法,看起來也更容易理解。

定義的類只是語法糖,目的是讓我們用更簡潔明了的語法創(chuàng)建對象及處理相關(guān)的繼承。

//定義類
class StdInfo {
  //...
}
console.log(typeof StdInfo); //function

console.log(StdInfo === StdInfo.prototype.constructor); //true

從上面的測試中可以看出來,類的類型就是一個函數(shù),是一個“特殊函數(shù)”,指向的是構(gòu)造函數(shù)。

函數(shù)的定義方式有函數(shù)聲明和函數(shù)表達式兩種,類的定義方式也有兩種,分別是:類聲明和類表達式。

類聲明

類聲明是定義類的一種方式,使用關(guān)鍵字class,后面跟上類名,然后就是一對大括號。把這一類需要定義的方法放在大括號中。

//定義類,可以省略constructor
class StdInfo {
  getNames(){
    console.log("name:"+this.name);
  }
}
// -------------------------------------
//定義類,加上constructor
class StdInfo {
  //使用new定義實例對象時,自動調(diào)用這個函數(shù),傳入?yún)?shù)
  constructor(name,age){
    this.name = name;      
    this.age = age;   
  }
  
  getNames(){
    console.log("name:"+this.name);   
  }
}
//定義實例對象時,傳入?yún)?shù)
var p = new StdInfo("job",30)

constructor是一個默認方法,使用new來定義實例對象時,自動執(zhí)行constructor函數(shù),傳入所需要的參數(shù),執(zhí)行完constructor后自動返回實例對象。

一個類中只能有一個constructor函數(shù),定義多個會報錯。

constructor中的this指向新創(chuàng)建的實例對象,利用this往新創(chuàng)建的實例對象擴展屬性。

在定義實例對象時,不需要在初始化階段做一些事,可以不用顯示的寫constructor函數(shù)。如果沒有顯式定義,一個空的constructor方法會被默認添加,constructor(){}

類表達式

類表達式是定義類的另一種形式,類似于函數(shù)表達式,把一個函數(shù)作為值賦給變量??梢园讯x的類賦值給一個變量,這時候變量就為類名。class關(guān)鍵字之后的類名可有可無,如果存在,則只能在類內(nèi)部使用。

定義類 class后面有類名:

const People = class StdInfo {
  constructor(){
    console.log(StdInfo); //可以打印出值,是一個函數(shù)
  }
}

new People();
new StdInfo(); //報錯,StdInfo is not defined;

定義類 class后面沒有類名:

const People = class {
  constructor(){

  }
}

new People();

立即執(zhí)行的類:

const p = new class {
  constructor(name,age){
    console.log(name,age);
  }
}("job",30)

立即執(zhí)行的類,在類前要加上new。p為類的實例對象。

不存在變量提升

定義類不存在變量提升,只能先定義類后使用,跟函數(shù)聲明有區(qū)別的。

//-----函數(shù)聲明-------
//定義前可以先使用,因為函數(shù)聲明提升的緣故,調(diào)用合法。
func();
function func(){}

//-----定義類---------------
new StdInfo(); //報錯,StdInfo is not defined
class StdInfo{}

EXTENDS繼承

使用extends關(guān)鍵字實現(xiàn)類之間的繼承。這比在ES5中使用繼承要方便很多。

//定義類父類
class Parent {
  constructor(name,age){
    this.name = name;
    this.age = age;
  }

  speakSometing(){
    console.log("I can speek chinese");
  }
}
//定義子類,繼承父類
class Child extends Parent {
  coding(){
    console.log("coding javascript");
  }
}

var c = new Child();

//可以調(diào)用父類的方法
c.speakSometing(); // I can speek chinese

使用繼承的方式,子類就擁有了父類的方法。

如果子類中有constructor構(gòu)造函數(shù),則必須使用調(diào)用super。

//定義類父類
class Parent {
  constructor(name,age){
    this.name = name;
    this.age = age;
  }

  speakSometing(){
    console.log("I can speek chinese");
  }
}
//定義子類,繼承父類
class Child extends Parent {
  constructor(name,age){
    //不調(diào)super(),則會報錯 this is not defined

    //必須調(diào)用super
    super(name,age);
  }

  coding(){
    console.log("coding javascript");
  }
}

var c = new Child("job",30);

//可以調(diào)用父類的方法
c.speakSometing(); // I can speek chinese

子類必須在constructor方法中調(diào)用super方法,否則新建實例時會報錯(this is not defined)。這是因為子類沒有自己的this對象,而是繼承父類的this對象,然后對其進行加工。如果不調(diào)用super方法,子類就得不到this對象。

總結(jié)

好了,以上就是對ES6中類的簡單總結(jié)學(xué)習(xí),希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 前端中的JS使用調(diào)試技巧

    前端中的JS使用調(diào)試技巧

    掌握各種js調(diào)試技巧,在前端開發(fā)中降低開發(fā)成本,起到事半功倍的效果。譬如,快速定位問題、降低故障概率、幫助分析邏輯錯誤等等。這篇文章主要介紹了前端中的JS使用調(diào)試技巧,需要的朋友可以參考下
    2022-12-12
  • JS代碼判斷IE6,IE7,IE8,IE9的函數(shù)代碼

    JS代碼判斷IE6,IE7,IE8,IE9的函數(shù)代碼

    JS代碼判斷瀏覽器版本,支持IE6,IE7,IE8,IE9!做網(wǎng)頁有時候會用到JS檢測IE的版本,下面是檢測Microsoft Internet Explorer版本的三種代碼
    2013-08-08
  • 淺析AMD CMD CommonJS規(guī)范--javascript模塊化加載學(xué)習(xí)心得總結(jié)

    淺析AMD CMD CommonJS規(guī)范--javascript模塊化加載學(xué)習(xí)心得總結(jié)

    下面小編就為大家分享一篇淺析AMD CMD CommonJS規(guī)范--javascript模塊化加載學(xué)習(xí)心得總結(jié)。小編覺得寫的非常不錯,需要的朋友可以過來參考一下
    2016-03-03
  • 原生js實現(xiàn)星星閃爍效果

    原生js實現(xiàn)星星閃爍效果

    這篇文章主要為大家詳細介紹了原生js實現(xiàn)星星閃爍效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 微信小程序開發(fā)之獲取用戶信息的兩種方法

    微信小程序開發(fā)之獲取用戶信息的兩種方法

    小程序可以通過微信官方提供的登錄方法方便地獲取微信提供的用戶身份標識,進而開發(fā)者可以進行下一步操作,下面這篇文章主要給大家介紹了關(guān)于微信小程序開發(fā)之獲取用戶信息的兩種方法,需要的朋友可以參考下
    2022-03-03
  • 鼠標滾輪控制網(wǎng)頁橫向移動實現(xiàn)思路

    鼠標滾輪控制網(wǎng)頁橫向移動實現(xiàn)思路

    設(shè)置window的scrollLeft值,這里一定要是window不能是body否則滾動有問題,綁定事件mousewhell 也必須是在body上,感興趣的各位可以了解下哈,希望可以幫助到你
    2013-03-03
  • 學(xué)習(xí)javascript的閉包,原型,和匿名函數(shù)之旅

    學(xué)習(xí)javascript的閉包,原型,和匿名函數(shù)之旅

    Javascript中有幾個非常重要的語言特性——對象、原型繼承、閉包。其中閉包 對于那些使用傳統(tǒng)靜態(tài)語言C/C++的程序員來說是一個新的語言特性,本文給大家介紹js的閉包,原型,和匿名函數(shù)之旅,感興趣的朋友一起學(xué)習(xí)吧
    2015-10-10
  • JavaScript的變量聲明與聲明提前用法實例分析

    JavaScript的變量聲明與聲明提前用法實例分析

    這篇文章主要介紹了JavaScript的變量聲明與聲明提前用法,結(jié)合實例形式分析了JavaScript變量聲明與聲明提前相關(guān)原理、用法及操作注意事項,需要的朋友可以參考下
    2019-11-11
  • 微信小程序日程預(yù)約功能實現(xiàn)

    微信小程序日程預(yù)約功能實現(xiàn)

    本文介紹了如何使用微信小程序開發(fā)一個日程預(yù)約系統(tǒng),該系統(tǒng)包括頂部日期選擇器、中部的canvas繪制區(qū)和底部的數(shù)據(jù)回顯區(qū),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-02-02
  • 很多人都是用下面的js刷新站IP和PV

    很多人都是用下面的js刷新站IP和PV

    有人用JS做網(wǎng)站跳轉(zhuǎn),也有人用很多其他作弊的方法,今天又發(fā)現(xiàn)有太多的人用這樣的方法實現(xiàn)兩個站的IP共享,把http://www.fzitv.net替換成自己的站
    2008-09-09

最新評論

拉萨市| 台湾省| 长子县| 乃东县| 荔波县| 金川县| 平利县| 思茅市| 遂溪县| 马龙县| 兰州市| 长春市| 阿尔山市| 汤阴县| 聂荣县| 英山县| 叙永县| 宝应县| 韶山市| 松原市| 洛扎县| 建宁县| 潮安县| 肥乡县| 林州市| 称多县| 措勤县| 阜平县| 北安市| 泗水县| 民丰县| 金门县| 琼结县| 林周县| 东至县| 太保市| 烟台市| 宁陵县| 钟祥市| 包头市| 绥棱县|