成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

再和“面向?qū)ο蟆闭剳賽?- class(四)

劉東 / 1001人閱讀

摘要:在上一篇文章里我介紹了一下面向?qū)ο缶幊痰母拍?,在最后終于喜出望外看到了提供了類的概念了。而到了里面真正的類與構(gòu)造函數(shù)現(xiàn)在是分離的,通過上面的代碼可以看出來,這種寫法正是面向?qū)ο蟮恼y(tǒng)寫法。

在上一篇文章里我介紹了一下面向?qū)ο缶幊痰母拍?,在最后終于喜出望外看到了ES6提供了類的概念了。那這個(gè)類如何去用,是這篇文章的主題。ES6給我們提供了一個(gè)class關(guān)鍵字。這個(gè)關(guān)鍵字跟以前的var let const很像,它們都是用做聲明的,而class就是用來聲明一個(gè)類的。

語法
class name [extends]{   //extends是用來繼承的,可選參數(shù)
    //class body
};

注意

class不能重復(fù)聲明(與let、const一樣)

類的本質(zhì)還是一個(gè)構(gòu)造函數(shù)

class Div{  //類
    constructor(x,y){   //構(gòu)造函數(shù)
        this.x=x;    //共享屬性,放在constructor里
        this.y=y;
    }//注意這里是沒有逗號(hào)的
    move(){    //共享方法,這里相當(dāng)于在Div.prototye上添加方法
        console.log("動(dòng)起來");
    }
}
console.dir(Div);   //在控制臺(tái)里看一下與ES5的面向?qū)ο蟪绦蛴惺裁床煌?/pre>

ES5里面的面向?qū)ο螅^的“類”與構(gòu)造函數(shù)其實(shí)是一個(gè)東西,也就是雙重角色。而到了ES6里面真正的類與構(gòu)造函數(shù)現(xiàn)在是分離的,通過上面的代碼可以看出來,這種寫法正是面向?qū)ο蟮恼y(tǒng)寫法。同時(shí),我們?cè)诳刂婆_(tái)里看到這個(gè)對(duì)象與ES5的對(duì)象區(qū)別僅在于顯示的名字上多了一個(gè)class關(guān)鍵字,如下圖:

下面我要詳細(xì)的對(duì)比一下ES5ES6的面向?qū)ο笥惺裁磪^(qū)別,以及用這種方式寫出來的對(duì)象與ECMAScript的內(nèi)置對(duì)象有什么區(qū)別,這樣做的目的能讓你清晰的明白面向?qū)ο缶幊叹烤故且环N什么樣的形式。

1、與ES5對(duì)比
const [div1,div2]=[new Div(10,20),new Div(15,20)];    //這兩個(gè)對(duì)象是為了對(duì)比他們身上的原型
div1.z=30;    //給實(shí)例添加一個(gè)私有屬性

console.log(
    typeof Div,    //function 構(gòu)造函數(shù)(雖說是類,但實(shí)質(zhì)還是構(gòu)造函數(shù))
    Div.prototype.constructor===Div,    //true 類本質(zhì)還是構(gòu)造函數(shù)(披著羊皮的狼)
    
    //Object.getPrototypeOf方法是用來取對(duì)象身上的原型,用它代替__proto__
    Object.getPrototypeOf(div1)===Div.prototype,    //true 實(shí)例的原型就是構(gòu)造函數(shù)的原型
    Object.getPrototypeOf(div1)===Object.getPrototypeOf(div2),  //true 兩個(gè)實(shí)例的原型都一樣,指向構(gòu)造函數(shù)的原型對(duì)象
    
    div1 instanceof Div,        //true div是它的實(shí)例
    div1.constructor===Div,        //true 實(shí)例的構(gòu)造函數(shù)就是類
    
    /*
     * 方法說明
     *  Object.getOwnPropertyNames()這個(gè)方法是用來獲取對(duì)象身上的所有屬性名
     *  hasOwnProperty()用來判斷某個(gè)屬性是對(duì)象自身的(true),還是繼承自原型對(duì)象的(false)
     *  Object.keys()返回對(duì)象所有可枚舉(遍歷)的屬性名
     */
    Object.getOwnPropertyNames(div1),//["x", "y", "z"] 實(shí)例自己的屬性
    div1.hasOwnProperty("x"),        //true 實(shí)例的屬性
    div1.hasOwnProperty("move"),    //false 這個(gè)方法是繼承而來的
    Object.keys(Div.prototype)        //[] 對(duì)象身上的方法都是不可枚舉的
);

//ES5定義的對(duì)象,身上的方法是可以枚舉的
function Car(){}
Car.prototype.drive=function(){
    console.log("竄的老快了");
}
console.log(Object.keys(Car.prototype));  //["drive"] 所有方法都是可枚舉的

從上面的代碼得出以下的結(jié)論

類的本質(zhì)還是構(gòu)造函數(shù),其實(shí)class就是個(gè)語法糖,它的內(nèi)部還是個(gè)構(gòu)造函數(shù)

class聲明的對(duì)象與ES5聲明的對(duì)象實(shí)質(zhì)上一樣

class聲明的對(duì)象,它身上的方法都不能被枚舉

2、與內(nèi)置對(duì)象對(duì)比
const [d1,d2]=[new Date(),new Date()];  //聲明兩個(gè)內(nèi)置對(duì)象實(shí)例
d1.x=10,d1.y=20,d1.z=30;    //給實(shí)例添加三個(gè)私有屬性

console.log(
    typeof Date,    //function
    Date.prototype.constructor===Date,    //true
    Object.getPrototypeOf(d1)===Date.prototype, //true
    Object.getPrototypeOf(d1)===Object.getPrototypeOf(d1),  //true
    d1 instanceof Date, //true
    d1.constructor===Date,  //true
    Object.getOwnPropertyNames(d1), //["x", "y", "z"]
    d1.hasOwnProperty("x"),  //true
    d1.hasOwnProperty("getDate"),   //false 這個(gè)方法是繼承于Date對(duì)象的
    Object.keys(Date.prototype),    //內(nèi)置對(duì)象身上的方法都是不可枚舉的
);

從上面的代碼得出以下的結(jié)論

自定義對(duì)象就是我們聲明的一個(gè)類似于內(nèi)置對(duì)象的對(duì)象

JavaScript的面向?qū)ο缶幊蹋瑢?shí)質(zhì)是把某個(gè)功能寫成一個(gè)對(duì)象,并且這個(gè)對(duì)象是在模仿內(nèi)置對(duì)象

添加屬性與方法

class聲明的對(duì)象同樣允許小伙伴們?nèi)涡缘奶砑訉傩耘c方法,包括共享與私有的。

共享屬性放在constructor里,共享方法放在大括號(hào)內(nèi)

私有屬性放在類身上,私有方法放在大括號(hào)內(nèi)同時(shí)前面要加static關(guān)鍵字

私有方法里this指向類本身,其它方法里的this指向?qū)嵗龑?duì)象

class Bear{
    constructor(){
        this.name="熊大";   //共享屬性(放在constructor里)
    }
    sleep(){    //共享方法(直接放在大括號(hào)里)
        this.name="熊二";    //this指向?qū)嵗?,所以在這里給this添加屬性還是實(shí)例的屬性
        console.log(`${this.name}愛睡覺`);
    }
    static gohome(){    //私有方法
        //類會(huì)默認(rèn)添加一個(gè)name屬性,值為class后面的那個(gè)單詞
        console.log(`${this.name}的家在森林`);  //這里的this并不會(huì)指向?qū)嵗?,而是指向?    }
}

//共享屬性與方法
const b1=new Bear();
console.log(b1.name);    //熊大    
b1.sleep();    //熊大愛睡覺
console.log(b1.name);    //熊二  sleep里重新定義了name屬性,所以在這就被改了

//私有屬性與方法
Bear.age=5;        //在外面添加私有屬性
console.log(b1.age);    //undefined 實(shí)例不具備
Bear.gohome();            //Bear的家在森林
//b1.goHome();            //報(bào)錯(cuò),它是私有方法

下篇文章會(huì)詳細(xì)介紹class里的繼承。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96657.html

相關(guān)文章

  • 再和面向對(duì)象戀愛 - 圖片預(yù)加載組件(七)

    摘要:源碼下載至此再和面向?qū)ο笳剳賽巯盗形恼乱呀?jīng)全部更新完畢寫文章不易,且行且珍惜 再和面向?qū)ο笳剳賽?- 對(duì)象簡介(一)再和面向?qū)ο笳剳賽?- 對(duì)象相關(guān)概念(二)再和面向?qū)ο笳剳賽?- 面向?qū)ο缶幊谈拍睿ㄈ┰俸兔嫦驅(qū)ο笳剳賽?- class(四)再和面向?qū)ο笳剳賽?- 繼承(五)再和面向?qū)ο笳剳賽?- super(六) 通過前面的六篇文章已經(jīng)把ES6的面向?qū)ο蟾蠡镎f清楚了,大家最關(guān)心的...

    caoym 評(píng)論0 收藏0
  • 再和面向對(duì)象戀愛 - 面向對(duì)象編程概念(三)

    摘要:說到底面向?qū)ο蟛攀浅绦蛘Z言的根本。其實(shí)面向?qū)ο缶幊陶f的就是自定義對(duì)象。里并沒有類的概念,所以嚴(yán)格上來講這是個(gè)假的面向?qū)ο罄锏拿嫦驅(qū)ο缶幊态F(xiàn)在好了,終于聽到別人鄙視我們了,給我們提供了類這個(gè)概念,其實(shí)是向傳統(tǒng)語言更靠齊了。 通過前兩篇文章,我們了解了對(duì)象的概念以及面向?qū)ο罄锏南嚓P(guān)概念等知識(shí),那前面說了對(duì)象分類里的前兩種,這篇文章要詳細(xì)去說第三種自定義對(duì)象,那真正的好戲這就來了! 面向?qū)ο?..

    Cruise_Chan 評(píng)論0 收藏0
  • 再和面向對(duì)象戀愛 - super(六)

    摘要:同時(shí)彈出的結(jié)果是指向了子類,又說明雖然調(diào)用的是父類的構(gòu)造函數(shù),但是調(diào)用完后會(huì)指向子類,指向也被改成了子類的實(shí)例。 在上一篇文章里介紹了繼承,那其中說過一個(gè)很關(guān)鍵的東西想要繼承子類里里必需先調(diào)用一個(gè)super方法。而super的作用絕對(duì)是價(jià)值連城!同時(shí)super的作用還有多種,并且跟你的使用環(huán)境有關(guān)系。 1、當(dāng)作函數(shù)使用 super被當(dāng)作函數(shù)使用,這種情況是最普遍的,上一篇文章里已經(jīng)使用...

    Towers 評(píng)論0 收藏0
  • 再和面向對(duì)象戀愛 - 繼承(五)

    摘要:面向?qū)ο罄镒畲蟮奶攸c(diǎn)應(yīng)該就屬繼承了。在第二篇文章里說過原型實(shí)例跟構(gòu)造函數(shù)之間的繼承,并且還講了一道推算題。 通過上一篇文章想必各位老鐵已經(jīng)熟悉了class了,這篇文章接著介紹繼承。面向?qū)ο罄镒畲蟮奶攸c(diǎn)應(yīng)該就屬繼承了。一個(gè)項(xiàng)目可能需要不斷的迭代、完善、升級(jí)。那每一次的更新你是要重新寫呢,還是在原有的基礎(chǔ)上改吧改吧呢?當(dāng)然,不是缺心眼的人肯定都會(huì)在原來的基礎(chǔ)上改吧改吧,那這個(gè)改吧改吧就需要...

    Airmusic 評(píng)論0 收藏0
  • 再和面向對(duì)象戀愛 - 對(duì)象相關(guān)概念(二)

    摘要:所有的對(duì)象都是由構(gòu)造函數(shù)創(chuàng)建的對(duì)象哪來的構(gòu)造函數(shù)生的。而普通函數(shù)不能生成對(duì)象不孕不育,構(gòu)造函數(shù)可以生成對(duì)象有生育能力。別急,記住那句話永遠(yuǎn)指向?qū)嵗龑?duì)象對(duì)應(yīng)的構(gòu)造函數(shù)的,那就先看實(shí)例對(duì)象是誰。 上一篇文章把對(duì)象的概念講解了一下,這篇文章要重點(diǎn)解釋最讓大家犯迷糊的一些概念,包括 構(gòu)造函數(shù) 實(shí)例 繼承 構(gòu)造函數(shù)的屬性與方法(私有屬性與方法) 實(shí)例的屬性與方法(共享屬性與方法) protot...

    qpwoeiru96 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<