Class
js中class
的由来是由构造函数衍生出来的在我们默认把首字母大写
的函数称为构造函数
function Person () {
console.log("this is a method");
}
而在es6中就引入class
的关键字,class
只是一个语法糖,它的实现基本可以使用es5实现
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__);
constructor
在class中默认都会创建class
方法如果没有创建则js引擎会自动添加一个空的constructor
方法
class Person {
}
//等价
class Person {
constructor() {
}
}
set和get
用来设置对某个属性
设置和取值的函数,可以在这个set/get
函数中做一些事情
这里我对属性x
设置存储函数操作x属性时就会触发
class Person {
constructor() {
this.x=0; //set触发
}
sayHello(){
console.log('test');
}
set x(val){
console.log("set触发");
}
get x(){
console.log("get触发");
}
}
let person1 = new Person();
person1.x=2; //set触发
console.log(person1.x); //get触发
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;
}
}
}
静态属性
在class
中定义静态属性,使用static
关键字
class Person {
static x = 0;
constructor() {
}
getX(){
console.log(Person.x);
}
}
let person1 = new Person();
person1.getX();
私有属性和私有方法
在之前还没有出现私有属性和公有属性我们约定变量名带_
为私有属性和私有方法,这种方法现在也还是很流行
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
属性这个方法是用来构造函数,用来判断是否是使用new
声明的构造函数或者调用Reflect.construct()
可以用来限制我们只是new的方式来初始化实例
function Person(){
if(new.target !== undefined) {
console.log("实例化");
}else {
console.log("必须实例化");
}
}
let person = new Person();