欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript ES6中CLASS的使用詳解

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

前言

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

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

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

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

ES6中CLASS的使用

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

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

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

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

定義類

到了ES6添加了類,作為對(duì)象的模板。通過class來(lái)定義一個(gè)類:

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

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

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

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

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

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

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

類聲明

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

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

constructor是一個(gè)默認(rèn)方法,使用new來(lái)定義實(shí)例對(duì)象時(shí),自動(dòng)執(zhí)行constructor函數(shù),傳入所需要的參數(shù),執(zhí)行完constructor后自動(dòng)返回實(shí)例對(duì)象。

一個(gè)類中只能有一個(gè)constructor函數(shù),定義多個(gè)會(huì)報(bào)錯(cuò)。

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

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

類表達(dá)式

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

定義類 class后面有類名:

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

new People();
new StdInfo(); //報(bào)錯(cuò),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í)例對(duì)象。

不存在變量提升

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

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

//-----定義類---------------
new StdInfo(); //報(bào)錯(cuò),StdInfo is not defined
class StdInfo{}

EXTENDS繼承

使用extends關(guān)鍵字實(shí)現(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(),則會(huì)報(bào)錯(cuò) 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方法,否則新建實(shí)例時(shí)會(huì)報(bào)錯(cuò)(this is not defined)。這是因?yàn)樽宇悰]有自己的this對(duì)象,而是繼承父類的this對(duì)象,然后對(duì)其進(jìn)行加工。如果不調(diào)用super方法,子類就得不到this對(duì)象。

總結(jié)

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

相關(guān)文章

  • js實(shí)現(xiàn)簡(jiǎn)單的前端分頁(yè)效果

    js實(shí)現(xiàn)簡(jiǎn)單的前端分頁(yè)效果

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡(jiǎn)單的前端分頁(yè)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 詳解JavaScript Promise和Async/Await

    詳解JavaScript Promise和Async/Await

    這篇文章主要介紹了JavaScript Promise和Async/Await,對(duì)異步編程感興趣的同學(xué),可以參考下
    2021-04-04
  • swiper插件自定義切換箭頭按鈕

    swiper插件自定義切換箭頭按鈕

    這篇文章主要為大家詳細(xì)介紹了swiper插件自定義切換箭頭按鈕,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 原生JS實(shí)現(xiàn)幻燈片

    原生JS實(shí)現(xiàn)幻燈片

    本文主要介紹了原生JS實(shí)現(xiàn)幻燈片的示例代碼,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • HTML+JS實(shí)現(xiàn)猜拳游戲的示例代碼

    HTML+JS實(shí)現(xiàn)猜拳游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用HTML+CSS+JS編寫一個(gè)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • bootstrap table.js動(dòng)態(tài)填充單元格數(shù)據(jù)的多種方法

    bootstrap table.js動(dòng)態(tài)填充單元格數(shù)據(jù)的多種方法

    這篇文章主要為大家詳細(xì)介紹了bootstrap table.js填充單元格數(shù)據(jù)的多種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • JavaScript+Canvas實(shí)現(xiàn)簡(jiǎn)單的柱狀圖

    JavaScript+Canvas實(shí)現(xiàn)簡(jiǎn)單的柱狀圖

    這篇文章主要為大家詳細(xì)介紹了JavaScript如何利用Canvas實(shí)現(xiàn)繪制簡(jiǎn)單的柱狀圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • 微信小程序常見頁(yè)面跳轉(zhuǎn)操作簡(jiǎn)單示例

    微信小程序常見頁(yè)面跳轉(zhuǎn)操作簡(jiǎn)單示例

    這篇文章主要介紹了微信小程序常見頁(yè)面跳轉(zhuǎn)操作,結(jié)合簡(jiǎn)單實(shí)例形式總結(jié)分析了微信小程序保留頁(yè)面跳轉(zhuǎn)、關(guān)閉頁(yè)面跳轉(zhuǎn)、返回上一級(jí)頁(yè)面等各種常見的跳轉(zhuǎn)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-05-05
  • Boostrap基礎(chǔ)教程之JavaScript插件篇

    Boostrap基礎(chǔ)教程之JavaScript插件篇

    Boostrap提供了12種JavaScript插件,在本文中給大家介紹了,不知道的朋友可以參考下,本文重點(diǎn)給大家介紹bootstrap基礎(chǔ)之js插件,感興趣的朋友一起學(xué)習(xí)吧
    2016-09-09
  • JS仿Base.js實(shí)現(xiàn)的繼承示例

    JS仿Base.js實(shí)現(xiàn)的繼承示例

    這篇文章主要介紹了JS仿Base.js實(shí)現(xiàn)的繼承,結(jié)合具體實(shí)例形式分析了javascript擴(kuò)展操作及面向?qū)ο蟪绦蛟O(shè)計(jì)相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-04-04

最新評(píng)論