聽說你對 ES6 class 類還不是很了解

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信?ruochuan12?參與。

前言

ES5中是原型函數,到了ES6中出現了"類"的概念。等同于是ES5的語法糖,大大提升了編寫代碼的速度,本文只講一些常用的(其實也就那幾個屬性),下面就讓我們來認識一下

基本使用

定義的關鍵字就是class,下面這樣就是定義了一個,跟我們ES5構造函數一樣,都是使用new關鍵字

class?Person?{}const?cateory?=?new?Person()?//?調用?類

類繼承

ES5中,我們要繼承的話得使用call或者prototype來繼承原型或者實例上的方法,但是在ES6中為我們提供了extends關鍵字直接使用就好,同樣它會繼承方法屬性

class?Person?{name?=?"前端娛樂圈";hello()?{return?"你好"}
}class?Scholl?extends?Person?{getName()?{return?this.name;}
}const?res?=?new?Scholl();
console.log(res.getName())?//?前端娛樂圈
console.log(res.hello())?//?你好

constructor

constructor構造函數,它就是當前實例的構造函數。每一個類里面只能存在一個constructor,當實例化的時候(也就是new)constructor會立即執行。如果一個里面沒有顯示定義constructor構造函數的話,會默認隱式被添加進中并且返回值是當前,當然也可以顯示手動return返回其它引用值,這時當前的實例就是constructor的返回值。

//?默認不寫
class?Person?{
}
console.log(new?Person())?//?默認constructor指向自己的實例//?顯示寫上constructor
class?Person1?{constructor()?{}
}
console.log(new?Person1())?//?顯示地寫上constructor構造函數。實例對象返回當前的constructor//?顯示的返回對象
class?Person2?{constructor()?{return?{}}
}
console.log(new?Person2())?//?這實例的返回值就是一個空對象,constructor返回值只有是對象才可以

super關鍵字

class?Person?{}class?school?extends?Person?{constructor()?{super()?//?這里繼承了Person類,但是必須使用super調用,否則會報錯。}
}

上面school類繼承了Person類,如果不在constructor中調用super關鍵字那么它就會報錯。因為子類沒有自己的this對象,而是繼承父類的this對象,這里的super關鍵字就是父類Person對象。最終實例化返回的是school實例,super函數 內部會Person.prorotype.constructor.call(this)

注意,super函數只能在類中執行一次,否則會報錯

super關鍵字也可以當做一個對象使用

class?Person?{getName()?{return?"前端娛樂圈"}
}
Person.prototype.name?=?"蛙人"
Perosn.prototype.age?=?18class?school?extends?Person?{constructor()?{const?res?=?super()?//?這里的super指向Person類console.log(super.getName(),?super.name)?//?這里的super關鍵字指向Person.prototype}getAge()?{console.log(super.age)}
}

上面代碼中,super函數只能擁有一個,但super關鍵字可以當成一個對象使用,super關鍵字當成對象指向的是父類prototype原型對象。super關鍵字可以在類的任何地方使用,但super函數只能在constructor中使用。

注意:super函數返回值是當前類的實例,super關鍵字指向的當前類的prototype

get

用于獲取取值屬性,剛在上面我們說過,私有屬性不能在類的外部訪問,但是我們可以通過get關鍵字來獲取類里面的私有屬性

class?Person?{private?username?=?"前端娛樂圈";private?age?=?18;get?getVal()?{return?this.username;}
}
const?res?=?new?Person();?
console.log(res.getVal)?//?前端娛樂圈

那么我們來看一下,這個get關鍵字和定義一個方法有何不同。

class?Person?{private?username?=?"前端娛樂圈";private?age?=?18;getVal()?{return?this.username;}
}
const?res?=?new?Person();?
console.log(res.getVal())?//?前端娛樂圈

上面我們把get關鍵字去掉了,并且調用時候的帶上了()代表要執行一個函數。雖然這樣寫跟get關鍵字效果是一樣的,但是不推薦我們這么寫,就像Vue中我們使用computed寫,就不推薦methods里面寫。官方定義的get取值函數,我們取值直接用get關鍵字就行也不用寫(),就像獲取一個屬性一樣。

set

set存值函數,上面說了get,那么有get就一定有set。存值函數跟取值函數一個意思,一個獲取一個設置嘛。

class?Person?{private?username?=?"前端娛樂圈";private?age?=?18;get?getVal()?{return?this.username;}set?setVal(val)?{this.username?=?val}
}
const?res?=?new?Person();?
res.setVal?=?"蛙人"
console.log(res.getVal())?//?蛙人

上面我們先執行了存值,然后在取值,跟我們預期的結果一樣,我們存值改變了username,獲取值也會改變。

私有屬性

中私有屬性必須以#開頭聲明,以#開頭的只能在中訪問,在的外部不能訪問。如果用的TypeScript完全可以使用private代替。

class?Person?{#name?=?"蛙人"constructor()?{}getName()?{return?this.#name}#getAge()?{return?18}
}
const?res?=?new?Person();
//?console.log(this.#name)?//?報錯,必須在封閉類中聲明該字段
console.log(res.getName())?//?蛙人
console.log(res.#getAge)?//?報錯,getAge?is?not?function

static

static的靜態屬性,"靜態數據"是啥意思呢,就是不用實例化就可以訪問的屬性。像我們不是static定義的屬性和方法都必須的實例化類才能調用。

這里需要注意一下,當我們定義完

非static定義的屬性

class?Person?{username?=?"前端娛樂圈";age?=?18;
}
const?res?=?new?Person().username;?//?前端娛樂圈

像我們這種非static定義的屬性,要想訪問username屬性就必須得實例化new才能訪問。

static定義的屬性

static定義的靜態屬性,就是不用實例化就可以直接訪問。不定義在實例化對象上面。

//?之前老的寫法
class?Person?{}
Person.username?=?"前端娛樂圈"//?新寫法,加一個static關鍵字即可
class?Person?{static?username?=?"前端娛樂圈";static?age?=?18;static?getName()?{return?Person.username}
}console.log(Person123.username,?Person123.getName())?//?前端娛樂圈,前端娛樂圈

之前老寫法的靜態屬性定義在類的外部。整個類生成以后,再生成靜態屬性。這樣讓人很容易忽略這個靜態屬性,也不符合相關代碼應該放在一起的代碼組織原則。為了解決這問題,就新出的static關鍵字靜態方法


以下這三個修飾符是在TypeScript類中才能使用,在JavaScript類中是不支持的。

6f220f0890adedb79e5a88d14dbfa025.png
報錯.png

public

public的公共屬性,就是不管在的內部還是外部,都可以訪問該屬性方法。默認定義的屬性方法都是public

class?Person?{name?=?"前端娛樂圈";public?age?=?18;
}
const?res?=?new?Person();
console.log(res.name,?res.age)?//?前端娛樂圈?18

上面可以看到打印結果都能顯示出來,name屬性沒有定義public公共屬性,所以里面定義的屬性方法默認都是public定義。

private

private的私有屬性,只有在當前里面才能訪問,當前就是{}里面區域內。在{}外面是不能訪問private定義的屬性方法

class?Person?{private?name?=?"前端娛樂圈";private?age?=?18;
}
const?res?=?new?Person();
console.log(res.name,?res.age)?//?這倆行會爆紅,當前屬性為私有屬性,只能在類內部訪問class?Scholl?extends?Person?{getData()?{return?this.username?+?","?+?this.age}
}
const?temp?=?new?Scholl()
console.log(temp.getData())?//?爆紅~,雖然繼承了Person類,但是private定義是只能在當前類訪問,子類也不能訪問。

protected

protected的保護屬性,只有在當前類子類可以訪問。也就是說用protected屬性定義的子類也可以訪問。

class?Person?{protected?username?=?"前端娛樂圈";protected?age?=?18;
}
const?res?=?new?Person();
console.log(res.name,?res.age)?//?這倆行會爆紅,當前屬性為私有屬性,只能在類內部訪問class?Scholl?extends?Person?{getData()?{return?this.username?+?","?+?this.age}
}
const?temp?=?new?Scholl()
console.log(temp.getData())?//?前端娛樂圈,18。可以正常訪問父類的屬性

例子

例如我們寫如下一個小Demo彈窗,可以單獨寫一個class類里面,這樣寫法是不是比我們ES5中的prototype寫法看著舒服多了。當然我們日常開發中的業務,公共方法也可以寫進一個里面

class?Mask?{isShow?=?false;elem?=?nullconstructor()?{this.elem?=?this.init()}init()?{const?oDiv?=?document.createElement("div");document.body.appendChild(oDiv);return?oDiv;}show()?{this.elem.style.display?=?"block"this.isShow?=?true;}hide()?{this.elem.style.display?=?"none"this.isShow?=?false;}
}

結語

ES6class類畢竟是一個“語法糖”,所以只要理解了JavaScript中對象的概念和面向對象的思想,class?就不難理解啦~,下篇準備更新TypeScript文章感興趣的小伙伴可以點個關注+贊哦。

最近組建了一個江西人的前端交流群,如果你是江西人可以加我微信?ruochuan12?私信 江西 拉你進群。

推薦閱讀

1個月,200+人,一起讀了4周源碼
我歷時3年才寫了10余篇源碼文章,但收獲了100w+閱讀

老姚淺談:怎么學JavaScript?

我在阿里招前端,該怎么幫你(可進面試群)

6efc09a299c3561e39fc978c3f34fce7.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》10余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助1000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

2e3be459c3ab8a1098211be0e13c72e6.png

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。歡迎分享、收藏、點贊、在看我的公眾號文章~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275221.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《CSS揭秘》讀書筆記

摘要 《CSS揭秘》主要是介紹了使用CSS的技巧,通過47個案例來靈活的使用CSS進行實現,同時在實現過程中注重CSS代碼的靈活性與健壯性。通過閱讀這本書有利于我們編寫高質量的CSS代碼以及打破使用CSS時的固定思維,能夠更加靈活的使用CSS。 《CSS…

一篇文章帶你搞懂前端面試技巧及進階路線

大家好,我是若川。最近有很多朋友給我后臺留言:自己投了不少簡歷,但是收到的面試邀請卻特別少;好不容易收到了大廠的面試邀請,但由于對面試流程不清楚,準備的特別不充分,結果也掛了;…

小屏幕 ui設計_UI設計基礎:屏幕

小屏幕 ui設計重點 (Top highlight)第4部分 (Part 4) Welcome to the fourth part of the UI Design basics. This time we’ll cover the screens you’ll likely design for. This is also a part of the free chapters from Designing User Interfaces.歡迎使用UI設計基礎知…

RabbitMQ指南之四:路由(Routing)和直連交換機(Direct Exchange)

在上一章中,我們構建了一個簡單的日志系統,我們可以把消息廣播給很多的消費者。在本章中我們將增加一個特性:我們可以訂閱這些信息中的一些信息。例如,我們希望只將error級別的錯誤存儲到硬盤中,同時可以將所有級別&am…

不用任何插件實現 WordPress 的彩色標簽云

側邊欄的標簽云(Tag Cloud)一直是 WordPress 2.3 以后的內置功能,一般直接調用函數wp_tag_cloud 或者在 Widgets 里開啟即可,但是默認的全部是一個顏色,只是大小不一樣,很是不順眼,雖然可以用 S…

隨時隨地能寫代碼, vscode.dev 出手了

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12 參與。今天偶然看到了 VSCode 官方發布了一條激動人心的 Twitter,vscode.dev[1] 域名上線了!image-20211021211915942新的域名 vscode.dev[2] 它是一個…

七種主流設計風格_您是哪種設計風格?

七種主流設計風格重點 (Top highlight)I had an idea for another mindblowing test, so here it is. Since you guys liked the first one so much, and I got so many nice, funny responses and private messages on how accurate it actually was, I thought you will prob…

算法精講:分享一道值得分享的算法題

分享一道leetcode上的題,當然,居然不是放在刷題貼里來講,意味著分享的這道題不僅僅是教你怎么來解決,更重要的是這道題引發出來的一些解題技巧或許可以用在其他地方,下面我們來看看這道題的描述。 問題描述 給定一個未…

正幾邊形可以實現無縫拼接?

正n邊形內角為 (n-2)*180/n ,要保證可以無縫拼接,就是一個圓可以被整數個n邊形內角拼接,即 360k*(n-2)*180/n > 2nk(n-2)。(摘自http://blog.csdn.net/ray58750034/article/details/1365813) 以下代碼表明&#xff…

React 18 Beta 來了

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12 參與,目前近3000人參與。經過「React18工作組」幾個月工作,11月16日v18終于從Alpha版本更新到Beta版本。本文會解釋:這次更新帶來的變化對開…

osg著色語言著色_探索數字著色

osg著色語言著色Learn how to colorize icons with your NounPro subscription and Adobe Illustrator.了解如何使用NounPro訂閱和Adobe Illustrator為圖標著色。 For those who want to level up their black and white Noun Project icons with a splash of color, unlockin…

upc組隊賽15 Supreme Number【打表】

Supreme Number題目鏈接 題目描述 A prime number (or a prime) is a natural number greater than 1 that cannot be formed by multiplying two smaller natural numbers. Now lets define a number N as the supreme number if and only if each number made up of an non-e…

CSS3實踐之路(一):CSS3之我觀

CSS 的英文全稱Cascading Style Sheets,中文意思是級聯樣式表,通過設立樣式表,可以統一地控制HMTL中各DOM元素的顯示屬性。級聯樣式表可以使人更能有效地控制網頁外觀。使用級聯樣式表,可以擴充精確指定網頁元素位置,外觀以及創建…

18個項目必備的JavaScript代碼片段——數組篇

大家好,我是若川。最近組織了源碼共讀活動,感興趣的可以加我微信 ruochuan12 參與,目前近3000人參與,0-5年工作經驗的都可以參與學習。1.chunk轉換二維數組將數組(array)拆分成多個數組,并將這些…

美學評價_卡美學的真正美

美學評價In collectible card games like Hearthstone, Legends of Runeterra, and Magic: The Gathering, the aesthetic of the cards is indubitably one of the greatest highlights for many, if not all players. Although the game loop is reliant on physically build…

好程序員web前端分享CSS Bug、CSS Hack和Filter學習筆記

為什么80%的碼農都做不了架構師?>>> CSS Bug、CSS Hack和Filter學習筆記 1)CSS Bug:CSS樣式在各瀏覽器中解析不一致的情況,或者說CSS樣式在瀏覽器中不能正確顯示的問題稱為CSS bug. 2)CSS Hack: CSS中,Hack是指一種兼容CSS在不同…

as3 淺復制 深復制

基元數據類型:boolean、int、uint、number、string 兩種復雜數據類型:array、object 當數組元素全部是基元數據類型時,即全部是值類型時,是沒有淺復制和深復制的區別。 當數組元素全部是復雜數據類型,即引用類型時&…

碎片化學前端,促進技術提升,我推薦這些

大家好,我是若川。眾所周知,關注公眾號可以了解學習掌握技術方向,學習優質好文,落實到自己項目中。還可以結交圈內好友,讓自己融入到積極上進的技術氛圍,促進自己的技術提升。話不多說,推薦這些…

ux和ui_設計更好的結帳體驗-UX / UI案例研究

ux和uiPlated Cuisine is a food ordering and delivery app for Plated Cuisine Restaurant founded and managed by Rayo Odusanya.Plated Cuisine是由Rayo Odusanya創建和管理的Plated Cuisine Restaurant的食品訂購和交付應用程序。 A short background about Rayo Rayo O…

Django中ajax發送post請求,報403錯誤CSRF驗證失敗解決辦法

今天學習Django框架,用ajax向后臺發送post請求,直接報了403錯誤,說CSRF驗證失敗;先前用模板的話都是在里面加一個 {% csrf_token %} 就直接搞定了CSRF的問題了;很顯然,用ajax發送post請求這樣就白搭了&…