溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

class在es6中怎么使用

發(fā)布時(shí)間:2022-10-31 10:09:13 來(lái)源:億速云 閱讀:130 作者:iii 欄目:web開(kāi)發(fā)

今天小編給大家分享一下class在es6中怎么使用的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

class在es6中本質(zhì)是函數(shù)(構(gòu)造器),使用的時(shí)候,也是直接對(duì)類(lèi)使用new命令,跟構(gòu)造函數(shù)的用法一致;class可以看作一個(gè)語(yǔ)法糖,讓對(duì)象原型的寫(xiě)法更加清晰、更像面向?qū)ο缶幊痰恼Z(yǔ)法。用class定義類(lèi)的方法“class Person{//類(lèi)聲明}”或“const Person=class{//類(lèi)表達(dá)式}”。

es6的Class類(lèi)詳解

class基本語(yǔ)法

JavaScript 語(yǔ)言中,生成實(shí)例對(duì)象的傳統(tǒng)方法是通過(guò)構(gòu)造函數(shù)和原型的組合模式.ES6 提供了更接近傳統(tǒng)語(yǔ)言(java)的寫(xiě)法,引入了 Class(類(lèi))這個(gè)概念,作為對(duì)象的模板。通過(guò)class關(guān)鍵字,可以定義類(lèi)。

class point{ 
   
	constructor(x,y){ 
   
        this.x=x;
        this.y=y;
    }
    play(){ 
   
        console.log("我會(huì)玩");
    }
}

ES6 的class可以看作只是一個(gè)語(yǔ)法糖,它的絕大部分功能,ES5 都可以做到,新的class寫(xiě)法只是讓對(duì)象原型的寫(xiě)法更加清晰、更像面向?qū)ο缶幊痰恼Z(yǔ)法而已。

注:“語(yǔ)法糖”:是由英國(guó)計(jì)算機(jī)科學(xué)家彼得·約翰·蘭達(dá)(Peter J. Landin)發(fā)明的一個(gè)術(shù)語(yǔ),指計(jì)算機(jī)語(yǔ)言中添加的某種語(yǔ)法,這種語(yǔ)法對(duì)語(yǔ)言的功能并沒(méi)有影響,但是更方便程序員使用。

class在ES6本質(zhì)就是函數(shù)(構(gòu)造器)

class在es6中怎么使用

class中的原型方法全部被添加到了parent的原型對(duì)象上

class在es6中怎么使用

ES6 的class與ES5寫(xiě)法的幾個(gè)核心注意點(diǎn): ES5 的構(gòu)造函數(shù)Point,對(duì)應(yīng) ES6 的Point類(lèi)的構(gòu)造方法。 類(lèi)的所有方法都定義在類(lèi)的prototype屬性上面。 定義“類(lèi)”的方法的時(shí)候,前面不需要加上function這個(gè)關(guān)鍵字,直接把函數(shù)定義放進(jìn)去了就可以了 方法之間不需要逗號(hào)分隔,加了會(huì)報(bào)錯(cuò) ES6的class使用方法與ES5的構(gòu)造函數(shù)一模一樣

//類(lèi)的所有方法都定義在類(lèi)的prototype屬性上面。
class piont{ 
   
    constructor(){ 
   
		//
    }
    play(){ 
   
        
    }
}
//上述代碼等價(jià)于
point.prototype={ 
   
    constructor() { 
   },
    play(){ 
   };
}

//在類(lèi)的實(shí)例上面調(diào)用方法,其實(shí)就是調(diào)用原型上的方法。
class Ba{ 
   
	//
}
let b=new Ba();
b.constructor===Ba.prototype.constructor//true

另外:ES5 的構(gòu)造函數(shù)Point,對(duì)應(yīng) ES6 的Point類(lèi)的構(gòu)造方法。

由于類(lèi)的方法都定義在prototype對(duì)象上面,所以類(lèi)的新方法可以添加在prototype對(duì)象上面。Object.assign方法可以很方便地一次向類(lèi)添加多個(gè)方法。

class ponit{ 
   
    constructor(){ 
   
        
    }
}
Object.assign(Point.prototype,{ 
   
	play(){ 
   };
})
//Class直接定義的方法之間不需要逗號(hào)分隔,加了會(huì)報(bào)錯(cuò). 但是這里是Object.assign的方法格式, 這里面需要往Point.prototype里面添加的方法就需要符合對(duì)象的默認(rèn)格式

類(lèi)的內(nèi)部所有定義的方法,都是不可枚舉的(non-enumerable)。通過(guò)Object.assign方法往類(lèi)的原型上添加的方法,constructor不可枚舉, 其他的可以枚舉

Class的基本語(yǔ)法之constructor

constructor方法是類(lèi)的默認(rèn)方法,通過(guò)new命令生成對(duì)象實(shí)例時(shí),自動(dòng)調(diào)用該方法。一個(gè)類(lèi)必須有constructor方法,如果沒(méi)有顯式定義,一個(gè)空的constructor方法會(huì)被默認(rèn)添加。

constructor方法默認(rèn)返回實(shí)例對(duì)象(即this),完全可以指定返回另外一個(gè)對(duì)象 (得是在創(chuàng)造class時(shí)就定義設(shè)置的, 在創(chuàng)造完class后,通過(guò)Object.assign的方式是沒(méi)法改變構(gòu)造函數(shù)的返回值的).

Class的基本語(yǔ)法之類(lèi)的調(diào)用方式

類(lèi)必須使用new調(diào)用,否則會(huì)報(bào)錯(cuò)。這是它跟普通構(gòu)造函數(shù) ( 普通構(gòu)造函數(shù)完全可以當(dāng)做普通函數(shù)使用 ) 的一個(gè)主要區(qū)別,后者不用new也可以執(zhí)行。

class在es6中怎么使用

Class的基本語(yǔ)法之getter和setter

與 ES5 一樣,在“類(lèi)”的內(nèi)部可以使用get和set關(guān)鍵字,對(duì)某個(gè)屬性設(shè)置存值函數(shù)和取值函數(shù),攔截該屬性的存取行為。

  class demo{ 
   
            constructor(age){ 
   
                this.age=agie;
                this._age=age;
            }
            get age(){ 
   
                return this._age;
            }
            set age(value){ 
   
                this._age=value;
                console.log("年齡"+value);
            }
        }
        let kevin=new demo(9);
        kevin.age=18;
        console.log(kevin.age);

Class的基本語(yǔ)法之類(lèi)的屬性名

class在es6中怎么使用

上面代碼中,Square類(lèi)的方法名getArea,是從表達(dá)式得到的。

Class的基本語(yǔ)法的特別注意點(diǎn)

(1)嚴(yán)格模式

類(lèi)和模塊的內(nèi)部,默認(rèn)就是嚴(yán)格模式,所以不需要使用use strict指定運(yùn)行模式。只要你的代碼寫(xiě)在類(lèi)或模塊之中,就只有嚴(yán)格模式可用??紤]到未來(lái)所有的代碼,其實(shí)都是運(yùn)行在模塊之中,所以 ES6 實(shí)際上把整個(gè)語(yǔ)言升級(jí)到了嚴(yán)格模式。

(2)不存在提升

new foo();
class foo{};

上面代碼中,F(xiàn)oo類(lèi)使用在前,定義在后,這樣會(huì)報(bào)錯(cuò),因?yàn)?ES6 不會(huì)把類(lèi)的聲明提升到代碼頭部。

(3)name 屬性

class point{
}
point.name//point

由于本質(zhì)上,ES6 的類(lèi)只是 ES5 的構(gòu)造函數(shù)的一層包裝,所以函數(shù)的許多特性都被Class繼承,包括name屬性。

(4)this 的指向

類(lèi)的方法內(nèi)部如果含有this,它默認(rèn)指向類(lèi)的實(shí)例。但是,必須非常小心,一旦單獨(dú)使用該方法,很可能報(bào)錯(cuò)。

class在es6中怎么使用

printName方法中的this,默認(rèn)指向Logger類(lèi)的實(shí)例。但是,如果將這個(gè)方法提取出來(lái)單獨(dú)使用,this會(huì)指向該方法運(yùn)行時(shí)所在的環(huán)境(由于 class 內(nèi)部是嚴(yán)格模式,所以 this 實(shí)際指向的是undefined),從而導(dǎo)致找不到print方法而報(bào)錯(cuò)。

解決辦法:

一個(gè)比較簡(jiǎn)單的解決方法是,在構(gòu)造方法中綁定this,這樣就不會(huì)找不到print方法了。

另一種解決方法是使用箭頭函數(shù)。箭頭函數(shù)位于構(gòu)造函數(shù)內(nèi)部,它的定義生效的時(shí)候,是在構(gòu)造函數(shù)執(zhí)行的時(shí)候。這時(shí),箭頭函數(shù)所在的運(yùn)行環(huán)境,肯定是實(shí)例對(duì)象,所以this會(huì)總是指向?qū)嵗龑?duì)象。

class Logger{ 
   
    constructor(){ 
   
        this.printName=this.printName.bind(this);
        //但是請(qǐng)注意bind之后返回的函數(shù)里面的this就永久鎖死了問(wèn)題:!!! !!! 堅(jiān)決別用 
    }
}
//箭頭函數(shù)
class Obj{ 
   
    constructor(){ 
   
        this.getThis=()=>this;
    }
}
let o=new Obj();
o.getThis()===o//true

Class的靜態(tài)屬性和方法

類(lèi)相當(dāng)于實(shí)例的原型,所有在類(lèi)中定義的方法,都會(huì)被實(shí)例繼承。如果在一個(gè)方法前,加上static關(guān)鍵字,就表示該方法不會(huì)被實(shí)例繼承,而是直接通過(guò)類(lèi)來(lái)調(diào)用,這就稱(chēng)為“靜態(tài)方法”。

 class Person{ 
   
            static sum=0;
            constructor(){ 
   
                this.add();
            }
            add(){ 
   
                Person.sum++;
            }
        }
        let kaiwen=new Person();
        console.log("當(dāng)前的聊天室人數(shù)為:"+Person.sum);
        //作用:當(dāng)沒(méi)有實(shí)例化的時(shí)候,我們可以通過(guò)靜態(tài)的屬性和方法去獲取一些信息
 // 注意,如果靜態(tài)方法包含this關(guān)鍵字,這個(gè)this指的是類(lèi),而不是實(shí)例。靜態(tài)方法可以與非靜態(tài)方法重名。

父類(lèi)的靜態(tài)方法,可以被子類(lèi)繼承靜態(tài)方法也是可以從super對(duì)象上調(diào)用的。

 class Person{ 
   
            constructor(name){ 
   
                this.name=name;
                this.sex="男";
            }
        }
        class Student extends Person{ 
   
            constructor(name,age){ 
   
                super(name);
                this.age=age;
            }
        }
        let s=new Student("張三",11);
        console.log(s.name);
        console.log(s.age);
        console.log(s.sex);

Class的私有方法和私有屬性

私有方法和私有屬性:是只能在類(lèi)的內(nèi)部訪問(wèn)的方法和屬性,外部不能訪問(wèn)。 這是常見(jiàn)需求,有利于代碼的封裝,但 ES6 不提供,只能通過(guò)變通方法模擬實(shí)現(xiàn)。

_bar方法前面的下劃線,表示這是一個(gè)只限于內(nèi)部使用的私有方法。但是,這種命名是不保險(xiǎn)的,在類(lèi)的外部,還是可以調(diào)用到這個(gè)方法

下面代碼中的寫(xiě)法不僅可以寫(xiě)私有屬性,還可以用來(lái)寫(xiě)私有方法

 class Cat{ 
   
            #eyes="眼睛";
            static pai(){ 
   
                console.log("凱文");
            }
            say(){ 
   
                Cat.pai();
                console.log("貓有一雙大大的"+this.#eyes);
            }
        }
        let kate=new Cat();
        kate.say();

私有屬性也可以設(shè)置 getter 和 setter 方法。

私有屬性不限于從this引用,只要是在類(lèi)的內(nèi)部,實(shí)例也可以引用私有屬性。

構(gòu)造函數(shù)的新屬性

ES6 為new命令引入了一個(gè)new.target屬性,該屬性一般用在構(gòu)造函數(shù)之中,返回new命令作用于的那個(gè)構(gòu)造函數(shù)。如果構(gòu)造函數(shù)不是通過(guò)new命令調(diào)用的,new.target會(huì)返回undefined,因此這個(gè)屬性可以用來(lái)確定構(gòu)造函數(shù)是怎么調(diào)用的。

私有屬性也可以設(shè)置 getter 和 setter 方法。

私有屬性不限于從this引用,只要是在類(lèi)的內(nèi)部,實(shí)例也可以引用私有屬性。

構(gòu)造函數(shù)的新屬性

ES6 為new命令引入了一個(gè)new.target屬性,該屬性一般用在構(gòu)造函數(shù)之中,返回new命令作用于的那個(gè)構(gòu)造函數(shù)。如果構(gòu)造函數(shù)不是通過(guò)new命令調(diào)用的,new.target會(huì)返回undefined,因此這個(gè)屬性可以用來(lái)確定構(gòu)造函數(shù)是怎么調(diào)用的。

class在es6中怎么使用

以上就是“class在es6中怎么使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI