Class
js中class
的由來是由構(gòu)造函數(shù)衍生出來的在我們默認(rèn)把首字母大寫
的函數(shù)稱為構(gòu)造函數(shù)
function Person () {
console.log("this is a method");
}
而在es6中就引入class
的關(guān)鍵字奋单,class
只是一個語法糖猫十,它的實現(xiàn)基本可以使用es5實現(xiàn)
function Person () {
console.log("this is a method");
}
class Perosn {
constructor() {
}
}
console.log(typeof Person);//function
在class中聲明方法
其實就是聲明在原型上
class Person {
constructor() {
}
sayHello(){
}
}
let person1 = new Person();
console.log(person1.__proto__);
[圖片上傳失敗...(image-3e4a89-1598679414888)]
constructor
在class中默認(rèn)都會創(chuàng)建class
方法如果沒有創(chuàng)建則js引擎會自動添加一個空的constructor
方法
class Person {
}
//等價
class Person {
constructor() {
}
}
set和get
用來設(shè)置對某個屬性
設(shè)置和取值的函數(shù)拖云,可以在這個set/get
函數(shù)中做一些事情
這里我對屬性x
設(shè)置存儲函數(shù)操作x屬性時就會觸發(fā)
class Person {
constructor() {
this.x=0; //set觸發(fā)
}
sayHello(){
console.log('test');
}
set x(val){
console.log("set觸發(fā)");
}
get x(){
console.log("get觸發(fā)");
}
}
let person1 = new Person();
person1.x=2; //set觸發(fā)
console.log(person1.x); //get觸發(fā)
generator方法
在class里聲明generator方式在方法前加*
號
class Person {
constructor() {
}
toString(){
console.log('parent toString method');
}
printName(){
this.toString()
}
* add(){
for(let i =0;i<10;i++) {
yield i;
}
}
}
靜態(tài)屬性
在class
中定義靜態(tài)屬性宙项,使用static
關(guān)鍵字
class Person {
static x = 0;
constructor() {
}
getX(){
console.log(Person.x);
}
}
let person1 = new Person();
person1.getX();
私有屬性和私有方法
在之前還沒有出現(xiàn)私有屬性和公有屬性我們約定變量名帶_
為私有屬性和私有方法,這種方法現(xiàn)在也還是很流行
class Person {
constructor() {
this._x=0;//私有屬性
this.y=0;//公有屬性
}
getX(){
console.log("公共方法");
}
_getY(){
console.log("私有方法");
}
}
不過在es6
中提出了一個方案使用#
來聲明私有屬性和私有方法
class Person {
#x=0;
constructor() {
this.y=0;//公有屬性
this.#x++;//私有屬性
}
getX(){
console.log(this.#x);
console.log("公共方法");
}
#getY(){
console.log("私有方法");
}
}
let person1 = new Person();
console.log(person1.y);
person1.getX(); //1
console.log(person1.#x);//Uncaught SyntaxError: Private field '#x' must be declared in an enclosing class
new.target屬性
new.target
屬性這個方法是用來構(gòu)造函數(shù)尤筐,用來判斷是否是使用new
聲明的構(gòu)造函數(shù)或者調(diào)用Reflect.construct()
可以用來限制我們只是new的方式來初始化實例
function Person(){
if(new.target !== undefined) {
console.log("實例化");
}else {
console.log("必須實例化");
}
}
let person = new Person();
[圖片上傳失敗...(image-d1ea38-1598679414888)]