<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • JavaScript ES6中CLASS的使用指南

    時(shí)間:2024-08-24 00:03:04 JavaScript 我要投稿
    • 相關(guān)推薦

    JavaScript ES6中CLASS的使用指南

      1、前言

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

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

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

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

      2、ES6中CLASS的使用

      javascript傳統(tǒng)做法是當(dāng)生成一個(gè)對(duì)象實(shí)例,需要定義構(gòu)造函數(shù),然后通過(guò)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ì)象,沒(méi)有類。它是是基于原型的語(yǔ)言,原型對(duì)象是新對(duì)象的模板,它將自身的屬性共享給新對(duì)象。這樣的寫(xiě)法和傳統(tǒng)面向?qū)ο笳Z(yǔ)言差異很大,很容易讓新手感到困惑。

      3、定義類

      到了ES6添加了類,作為對(duì)象的模板。通過(guò)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();

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

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

      //定義類class StdInfo { //...}console.log(typeof StdInfo); //functionconsole.log(StdInfo === StdInfo.prototype.constructor); //true

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

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

      4、類聲明

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

      //定義類,可以省略constructorclass StdInfo { getNames(){ console.log("name:"+this.name); }}// -------------------------------------//定義類,加上constructorclass 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í),不需要在初始化階段做一些事,可以不用顯示的寫(xiě)constructor函數(shù)。如果沒(méi)有顯式定義,一個(gè)空的constructor方法會(huì)被默認(rèn)添加,constructor(){}

      5、類表達(dá)式

      類表達(dá)式是定義類的另一種形式,類似于函數(shù)表達(dá)式,把一個(gè)函數(shù)作為值賦給變量。可以把定義的類賦值給一個(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后面沒(méi)有類名:

      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ì)象。

      6、不存在變量提升

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

      //-----函數(shù)聲明-------//定義前可以先使用,因?yàn)楹瘮?shù)聲明提升的緣故,調(diào)用合法。func();function func(){}//-----定義類---------------new StdInfo(); //報(bào)錯(cuò),StdInfo is not definedclass StdInfo{}

      7、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)樽宇悰](méi)有自己的this對(duì)象,而是繼承父類的this對(duì)象,然后對(duì)其進(jìn)行加工。如果不調(diào)用super方法,子類就得不到this對(duì)象。

      8、總結(jié)

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

    【JavaScript ES6中CLASS的使用指南】相關(guān)文章:

    perl- javascript中class的機(jī)制05-03

    JavaScript中的with關(guān)鍵字07-24

    在Java中執(zhí)行JavaScript代碼07-14

    Javascript中typeof 用法歸納09-27

    抽象語(yǔ)法樹(shù)在JavaScript中的應(yīng)用08-18

    JavaScript中的三種對(duì)象10-24

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

    詳解JavaScript中的splice()使用方法08-20

    javascript中for/in循環(huán)以及常見(jiàn)的使用技巧06-24

    javascript面向?qū)ο笾械膶?duì)象怎么理解09-02

    主站蜘蛛池模板: 免费国产在线精品一区| 久久精品国产亚洲AV大全| 亚洲精品国产精品乱码不卡| 99久久精品毛片免费播放| 久久久久亚洲精品天堂久久久久久| 91久久婷婷国产综合精品青草 | 亚洲A∨午夜成人片精品网站| 久久成人精品视频| 久久久久久九九99精品| 青青草97国产精品免费观看| 91精品福利在线观看| 国产午夜精品一区二区三区漫画| 香港aa三级久久三级老师2021国产三级精品三级在 | 精品久久久久久国产牛牛app| 动漫精品专区一区二区三区不卡 | 国产高清在线精品一本大道| 91精品在线播放| 国产伦精品免编号公布| 亚洲精品少妇30p| 亚洲国产91精品无码专区| 精品国产国产综合精品| 亚洲精品福利视频| 精品国产综合成人亚洲区| 国产成人精品无码片区在线观看 | 日韩精品一区二区三区色欲AV| 日本精品久久久久影院日本| 国产精品尹人在线观看| 国产韩国精品一区二区三区| 91精品在线播放| 91亚洲国产成人久久精品网址 | 久久久久久极精品久久久| 88久久精品无码一区二区毛片| 99精品视频在线观看| 精品无码人妻一区二区三区品| 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二| 国产在AJ精品| 国产综合色产在线精品| 精品国产婷婷久久久| 久久久久九九精品影院| 欧美精品一区二区久久| 人妻VA精品VA欧美VA|