前端-JavaScript中的class | IT人
文章推薦指數: 80 %
類類是用於建立物件的模板。
JavaScript中生成物件例項的方法是通過建構函式,這跟主流面嚮物件語言(java,C#)寫法上差異較大,如下:function ...
Togglenavigation
IT人
IT人
前端-JavaScript中的class
程式設計碼農發表於
2021-10-26
前端
JavaScript
類類是用於建立物件的模板。
JavaScript中生成物件例項的方法是通過建構函式,這跟主流面嚮物件語言(java,C#)寫法上差異較大,如下:functionPoint(x,y){
this.x=x;
this.y=y;
}
Point.prototype.toString=function(){
return'('+this.x+','+this.y+')';
};
varp=newPoint(1,1);ES6提供了更接近Java語言的寫法,引入了Class(類)這個概念,作為物件的模板。
通過class關鍵字,可以定義類。
如下:constructor()是構造方法,而this代表例項物件:classPoint{
constructor(x,y){
this.x=x;
this.y=y;
}
toString(){
return'('+this.x+','+this.y+')';
}
}類的資料型別就是函式,它本身就是指向函式的建構函式://ES5函式宣告
functionPoint(){
//...
}
//ES6類宣告
classPoint{
//....
constructor(){
}
}
typeofPoint//"function"
Point===Point.prototype.constructor//true在類裡面定義的方法是掛到Point.prototype,所以類只是提供了語法糖,本質還是原型鏈呼叫。
classPoint{
constructor(x,y){
this.x=x;
this.y=y;
}
toString(){
return'('+this.x+','+this.y+')';
}
}
Point.prototype={
//....
toString()
}
varp=newPoint(1,1);
p.toString()//(1,1)類的另一種定義方式類表示式//未命名/匿名類
letPoint=class{
constructor(x,y){
this.x=x;
this.y=y;
}
};
Point.name//Point函式宣告和類宣告有個重要區別,函式宣告會提升,類宣告不會提升。
letp=newPoint();//被提升不會報錯
functionPoint(){}
letp=newPoint();//報錯,ReferenceError
classPoint{}constructor()constructor()方法是類的預設方法,new生成例項物件時會自動呼叫該方法。
一個類必須有constructor()方法,如果沒有顯式定義,引擎會預設新增一個空的constructor()。
constructor()方法預設返回例項物件(即this)。
classPoint{
}
//自動新增
classPoint{
constructor(){}
}getter和setter與ES5一樣,在類的內部可以使用get和set關鍵字,對某個屬性設定存值函式和取值函式,攔截該屬性的存取行為。
classUser{
constructor(name){
this.name=name;
}
getname(){
returnthis.name;
}
setname(value){
this.name=value;
}
}
this類的方法內部的this,它預設指向類的例項,在呼叫存在this的方法時,需要使用obj.method()方式,否則會報錯。
classUser{
constructor(name){
this.name=name;
}
printName(){
console.log('Nameis'+this.name)
}
}
constuser=newUser('jack')
user.printName()//Nameisjack
const{printName}=user;
printName()//報錯Cannotreadpropertiesofundefined(reading'name')如果要單獨呼叫又不報錯,一種方法可以在構造方法裡呼叫bind(this)。
classUser{
constructor(name){
this.name=name;
this.printName=this.printName.bind(this);
}
printName(){
console.log('Nameis'+this.name)
}
}
constuser=newUser('jack')
const{printName}=user;
printName()//Nameisjackbind(this)會建立一個新函式,並將傳入的this作為該函式在呼叫時上下文指向。
另外可以使用箭頭函式,因為箭頭函式內部的this總是指向定義時所在的物件。
classUser{
constructor(name){
this.name=name;
}
printName=()=>{
console.log('Nameis'+this.name)
}
}
constuser=newUser('jack')
const{printName}=user;
printName()//Nameisjack靜態屬性靜態屬性指的是類本身的屬性,而不是定義在例項物件this上的屬性。
classUser{
}
User.prop=1;
User.prop//1靜態方法可以在類裡面定義靜態方法,該方法不會被物件例項繼承,而是直接通過類來呼叫。
靜態方法裡使用this是指向類。
classUtils{
staticprintInfo(){
this.info();
}
staticinfo(){
console.log('hello');
}
}
Utils.printInfo()//hello關於方法的呼叫範圍限制,比如:私有公有,ES6暫時沒有提供,一般是通過約定,比如:在方法前面加下劃線_print()表示私有方法。
繼承Java中通過extends實現類的繼承。
ES6中類也可以通過extends實現繼承。
繼承時,子類必須在constructor方法中呼叫super方法,否則新建例項時會報錯。
classPoint3DextendsPoint{
constructor(x,y,z){
super(x,y);//呼叫父類的constructor(x,y)
this.z=z;
}
toString(){
returnsuper.toString()+''+this.z;//呼叫父類的toString()
}
}父類的靜態方法,也會被子類繼承。
classParent{
staticinfo(){
console.log('helloworld');
}
}
classChildextendsParent{
}
Child.info()//helloworld
super關鍵字在子類的建構函式必須執行一次super函式,它代表了父類的建構函式。
classParent{}
classChildextendsParent{
constructor(){
super();
}
}在子類普通方法中通過super呼叫父類的方法時,方法內部的this指向當前的子類例項。
classParent{
constructor(){
this.x=1;
this.y=10
}
printParent(){
console.log(this.y);
}
print(){
console.log(this.x);
}
}
classChildextendsParent{
constructor(){
super();
this.x=2;
}
m(){
super.print();
}
}
letc=newChild();
c.printParent()//10
c.m()//2_proto_和prototype初學JavaScript時,_proto_和prototype很容易混淆。
首先我們知道每個JS物件都會對應一個原型物件,並從原型物件繼承屬性和方法。
prototype一些內建物件和函式的屬性,它是一個指標,指向一個物件,這個物件的用途就是包含所有例項共享的屬性和方法(我們把這個物件叫做原型物件)。
_proto_每個物件都有這個屬性,一般指向對應的建構函式的prototype屬性。
下圖是一些擁有prototype內建物件。
根據上面描述,看下面程式碼varobj={}//等同於varobj=newObject()
//obj.__proto__指向Object建構函式的prototype
obj.__proto__===Object.prototype//true
//obj.toString呼叫方法從Object.prototype繼承
obj.toString===obj.__proto__.toString//true
//陣列
vararr=[]
arr.__proto__===Array.prototype//true對於function物件,宣告的每個function同時擁有prototype和__proto__屬性,建立的物件屬性__proto__指向函式prototype,函式的__proto__又指向內建函式物件(Function)的prototype。
functionFoo(){}
varf=newFoo();
f.__proto__===Foo.prototype//true
Foo.__proto__===Function.prototype//true
繼承中的__proto__類作為建構函式的語法糖,也會同時有prototype屬性和__proto__屬性,因此同時存在兩條繼承鏈。
子類的__proto__屬性,表示建構函式的繼承,總是指向父類。
子類prototype屬性的__proto__屬性,表示方法的繼承,總是指向父類的prototype屬性。
classParent{
}
classChildextendsParent{
}
Child.__proto__===Parent//true
Child.prototype.__proto__===Parent.prototype//true繼承例項中的__proto__子類例項的__proto__屬性,指向子類構造方法的prototype。
子類例項的__proto__屬性的__proto__屬性,指向父類例項的__proto__屬性。
也就是說,子類的原型的原型,是父類的原型。
classParent{
}
classChildextendsParent{
}
varp=newParent();
varc=newChild();
c.__proto__===p.__proto__//false
c.__proto__===Child.prototype//true
c.__proto__.__proto__===p.__proto__//true
小結JavaScript中的Class更多的還是語法糖,本質上繞不開原型鏈。
歡迎大家留言交流。
相關文章
JavaScript裡三個點...的用法
2021-10-17
JavaScript
有個開發者總結這15優雅的JavaScript個技巧
2021-10-18
JavaScript
如何在前端通過JavaScript建立修改CAD圖形
2021-10-18
前端JavaScript
JavaScript中的樹型資料結構
2021-10-19
資料結構JavaScript
42+JavaScript高頻手寫題及詳細答案,胖頭魚喊你直接通過考核
2021-10-20
JavaScript
JavaScript陣列常用方法(二)
2021-10-20
JavaScript
初探JavaScriptPDFblob轉換為Worddocx方法
2021-10-20
JavaScript
Javascript深入之作用域與閉包
2021-10-20
JavaScript
結構相似,執行相同!26%的惡意JavaScript軟體利用混淆技術逃過安全檢測
2021-10-21
JavaScript
LaravelClassenvdoesnotexist問題排查
2021-10-21
Laravel
長沙前端培訓班分享:JavaScript正則全面解析
2021-10-21
前端JavaScript
爬蟲逆向基礎,理解JavaScript模組化程式設計webpack
2021-10-21
爬蟲JavaScriptWebpack
前端-JavaScript基礎知識
2021-10-21
前端JavaScript
前端技術分享:JavaScript正則全面解析
2021-10-22
前端JavaScript
前端-JavaScript新特性(ES6)
2021-10-22
前端JavaScriptES6
javascript實現網頁截圖匯出方案
2021-10-23
JavaScript
【JavaScript實用技巧(一)】迴圈遍歷與跳出迴圈遍歷
2021-10-26
JavaScript
javascript關於toFixed的計算規則
2021-10-26
JavaScript
最新文章
DOTA2大規模更新版地圖重做版本號7.20NH
獲阿里影業7億借款馳援華誼兄弟獲“阿里系”借款支援LT
吳宣儀粉絲後援會捐款50萬建希望醫院MQ
京東獲美國鞋服協會認證戳中阿里“軟肋”VC
短視訊新規影響幾何?加強監管已成常態ZT
浙江小夥沉迷暴力遊戲過度產生幻覺失聯12天終獲救HL
LOL8.23版本更新內容詳細說明全服更新7小時12點後可登陸JK
英雄聯盟最新維護時間/版本訊息新版本裝備物品一覽UM
蘇寧易購“五一”大資料:電視比王思聰的都大YL
電商平臺會員制眼花繚亂到底選哪個才划算?LF
LOL轉會最新情況彙總Loken加入TOP戰隊擔任首發位置MO
防騙指南:二手購物平臺坑貨多GM
延伸文章資訊
- 1前端-JavaScript中的class | IT人
類類是用於建立物件的模板。JavaScript中生成物件例項的方法是通過建構函式,這跟主流面嚮物件語言(java,C#)寫法上差異較大,如下:function ...
- 2深入理解JavaScript 中的class | IT人
深入理解JavaScript 中的class(類) 學習內容: 1、 掌握ES6中建立類和物件的方式2、 掌握ES6中類的繼承3、 掌握ES6中靜態方法的使用和呼叫4、 ...
- 3JavaScript | ES6 中最容易誤會的語法糖Class - 基本用法
在JavaScript 的Prototype-Based 物件導向中,不區分Class 和Object 所有的東西都可以是Object ,. 且不一定需要經過Class 或Constructor...
- 4[筆記] 談談JavaScript ES6中的Classes - PJCHENder
在JavaScript中仍然是使用prototypal inheritance的方法。 class的這種做法在JavaScript實際上只是syntax sugar,也就是說,它只是用來建立物件...
- 5Classes - JavaScript - MDN Web Docs
ECMAScript 6 中引入了類別(class) 作為JavaScript 現有原型程式(prototype-based)繼承的語法糖。類別語法並不是要引入新的物件導向繼承模型 ...