成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

聊一聊ES6中class的使用

soasme / 679人閱讀

摘要:傳統(tǒng)做法是當(dāng)生成一個對象實(shí)例,需要定義構(gòu)造函數(shù),然后通過的方式完成。如果子類中有構(gòu)造函數(shù),則必須使用調(diào)用。這是因?yàn)樽宇悰]有自己的對象,而是繼承父類的對象,然后對其進(jìn)行加工。

javascript傳統(tǒng)做法是當(dāng)生成一個對象實(shí)例,需要定義構(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的方式得到一個實(shí)例對象
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ù)表達(dá)式兩種,類的定義方式也有兩種,分別是:類聲明類表達(dá)式

類聲明

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

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

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

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

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

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

類表達(dá)式

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

定義類 class后面有類名:

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

new People();
new StdInfo();  //報(bào)錯,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í)行的類,在類前要加上newp為類的實(shí)例對象。

不存在變量提升

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

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

//-----定義類---------------
new StdInfo();  //報(bào)錯,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(),則會報(bào)錯  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í)例時會報(bào)錯(this is not defined)。這是因?yàn)樽宇悰]有自己的this對象,而是繼承父類的this對象,然后對其進(jìn)行加工。如果不調(diào)用super方法,子類就得不到this對象。

以上是對ES6中類的簡單總結(jié)學(xué)習(xí),歡迎一起討論。

參考:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

http://es6.ruanyifeng.com/#docs/class

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/80960.html

相關(guān)文章

  • 一聊Vue組件模版,你知道它有幾種定義方式嗎?

    摘要:活動結(jié)束單文件組件使用構(gòu)建工具創(chuàng)建項(xiàng)目,綜合來看單文件組件應(yīng)該是最好的定義組件的方式,而且不會帶來額外的模版語法的學(xué)習(xí)成本。 前端組件化開發(fā)已經(jīng)是一個老生常談的話題了,組件化讓我們的開發(fā)效率以及維護(hù)成本帶來了質(zhì)的提升。 當(dāng)然因?yàn)楝F(xiàn)在的系統(tǒng)越來越復(fù)雜龐大,所以開發(fā)與維護(hù)成本就變得必須要考慮的問題,因此滋生出了目前的三大前端框架 Vue、Angular、React。 那今天我們就來看看 V...

    instein 評論0 收藏0
  • 一聊BEM設(shè)計(jì)模式在Vue組件開發(fā)應(yīng)用

    摘要:聊一聊設(shè)計(jì)模式在組件開發(fā)中的應(yīng)用回想一下在你的前端生涯中是否遇到過以下問題在寫的時候經(jīng)常會在命名時絞盡腦汁在團(tuán)隊(duì)多人開發(fā)中出現(xiàn)命名沖突在進(jìn)行組件化開發(fā)時如何規(guī)范書寫什么是是團(tuán)隊(duì)提出的一種的命名方式,通過這種命名方式可以很好地解決上面遇到的問 聊一聊BEM設(shè)計(jì)模式在Vue組件開發(fā)中的應(yīng)用 回想一下在你的前端生涯中是否遇到過以下問題1.在寫css的時候經(jīng)常會在命名class時絞盡腦汁2.在...

    阿羅 評論0 收藏0
  • 一聊BEM設(shè)計(jì)模式在Vue組件開發(fā)應(yīng)用

    摘要:聊一聊設(shè)計(jì)模式在組件開發(fā)中的應(yīng)用回想一下在你的前端生涯中是否遇到過以下問題在寫的時候經(jīng)常會在命名時絞盡腦汁在團(tuán)隊(duì)多人開發(fā)中出現(xiàn)命名沖突在進(jìn)行組件化開發(fā)時如何規(guī)范書寫什么是是團(tuán)隊(duì)提出的一種的命名方式,通過這種命名方式可以很好地解決上面遇到的問 聊一聊BEM設(shè)計(jì)模式在Vue組件開發(fā)中的應(yīng)用 回想一下在你的前端生涯中是否遇到過以下問題1.在寫css的時候經(jīng)常會在命名class時絞盡腦汁2.在...

    LinkedME2016 評論0 收藏0
  • 一聊Java日志之一:slf4j

    摘要:一引言程序員都知道,日志對于一個應(yīng)用系統(tǒng)來說至關(guān)重要,現(xiàn)在應(yīng)該也沒有無日志的系統(tǒng)了吧。具體的日志實(shí)現(xiàn)還是需要使用不同的日志框架來完成。然后如下使用測試測試測試測試運(yùn)行結(jié)果發(fā)現(xiàn)并沒有打印出日志,這是因?yàn)槿鄙倭伺渲梦募? 一、引言   程序員都知道,日志對于一個應(yīng)用系統(tǒng)來說至關(guān)重要,現(xiàn)在應(yīng)該也沒有無日志的系統(tǒng)了吧。很多程序員都知道 Log4j,Logback,java.util.loggi...

    church 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<