中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      JavaScript ES6中CLASS的使用指南

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

      JavaScript ES6中CLASS的使用指南

        1、前言

        對于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。

        2、ES6中CLASS的使用

        javascript傳統(tǒng)做法是當(dā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言差異很大,很容易讓新手感到困惑。

        3、定義類

        到了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); //functionconsole.log(StdInfo === StdInfo.prototype.constructor); //true

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

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

        4、類聲明

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

        //定義類,可以省略constructorclass StdInfo { getNames(){ console.log("name:"+this.name); }}// -------------------------------------//定義類,加上constructorclass 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是一個默認(rèn)方法,使用new來定義實例對象時,自動執(zhí)行constructor函數(shù),傳入所需要的參數(shù),執(zhí)行完constructor后自動返回實例對象。

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

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

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

        5、類表達式

        類表達式是定義類的另一種形式,類似于函數(shù)表達式,把一個函數(shù)作為值賦給變量。可以把定義的類賦值給一個變量,這時候變量就為類名。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為類的實例對象。

        6、不存在變量提升

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

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

        7、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對象。

        8、總結(jié)

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

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

      perl- javascript中class的機制05-03

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

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

      Javascript中typeof 用法歸納09-27

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

      JavaScript中的三種對象10-24

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

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

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

      s("download_bottom");

      主站蜘蛛池模板: 农安县| 亚洲中出视频| 福泉市| 午夜福利视频男同女同| 无码 免费 国产在线观看91| 中文字幕亚洲第一页在线| 女同性恋精品一区二区三区| 国产免费午夜福利蜜芽无码| 一区二区三区国产在线网站视频| 国产人成无码视频在线1000| AⅤ无码精品视频| 久色精品国产亚洲av麻豆一| 横峰县| 亚洲精品国产二区三区在线| 亚洲中文字幕女同一区二区三区| av国产剧情一区二区三区| 中文字幕有码一区二区三区| 国产精品无码久久久久下载| 国产成年无码aⅴ片在线观看| 方山县| 亚洲二区三区在线播放| 十堰市| 正蓝旗| 中超| 久久婷婷是五月综合色| 日韩精品一区二区三区中文| 午夜爽毛片| 一区二区三区国产97| 精品理论一区二区三区| 阿拉善盟| 日本一区二区三区视频一| 日本亚洲成人中文字幕| 国产精品黄片一区二区三区视频| 精品亚洲人伦一区二区三区| 欧洲AV秘 无码一区二区三| 精品免费一区二区三区在| 18禁黄无遮挡免费网站| 国产三级精品美女三级| 操B小视频国产| 人妻少妇av中文字幕乱码免费| 亚洲综合一区二区三区蜜臀av|