Class
作用:定義一個類
語法:
class 類名{} 等同于 class 類名{constructor(){}}
ES5定義構(gòu)造函數(shù)function Point(){}
constructor方法的作用:相當于ES5的構(gòu)造函數(shù)Point函數(shù)的作用
例:class Father{}
Father是一個函數(shù),當new調(diào)用Father函數(shù)時,立即調(diào)用constructor函數(shù)(this指向?qū)嵗?,定義類時默認有一個constructor
使用:通過new來調(diào)用類,可以實例化一個對象
const p = new 類名()
定義實例屬性/方法
class Point{
constructor(name){
this.name = name
this.eat = function(){
return 'eat'
}
}
hobby = '跳舞'
eat2(){
return 'eat2'
}
get prop(){
return 'prop'
}
set prop(value){
console.log(set+'value')
}
}
定義靜態(tài)屬性/方法(注:靜態(tài)方法中的this指向的是類而不是實例)
class Father{
static see(){
return 'see'
}
static text = 'hello world'
}
繼承:(一個子類可以繼承父類的所有方法和屬性)
class Child extends Father{} 等同于 class Child extends Father{constructor(){super()}}
必須調(diào)用super方法來得到與父類同樣的屬性和方法,再定義子類自己的屬性和方法
super的使用:
super作函數(shù)使用,代表父類的構(gòu)造函數(shù),super在調(diào)用時this指向子類
super作對象使用,在普通方法中,指向父類的顯示原型對象;在靜態(tài)方法中,指向父類
與ES5定義構(gòu)造函數(shù)的區(qū)別:
只是定義構(gòu)造函數(shù)的語法不同,ES6中Class定義類算是ES5定義構(gòu)造函數(shù)的語法糖
與真正的面向?qū)ο缶幊痰恼Z言的區(qū)別:
Class定義類只是語法上的面向?qū)ο螅瑢嶋H上并不是采用的面向?qū)ο蟮乃枷耄cES5來定義構(gòu)造函數(shù),實例化對象的思想完全相同,只是寫法更簡潔
返回值的問題:
函數(shù)普通調(diào)用默認返回的是undefined
new 調(diào)用默認的返回值是this,this指向?qū)嵗龑ο?constructor方法調(diào)用的返回值是this,this指向?qū)嵗龑ο?
對象中的屬性分為訪問描述符(get/set)和數(shù)據(jù)描述符