基本理解:类是一些实例对象共有的属性和方法的抽象集合。
类的创建:类的创建使用关键字class,一般创建形式为
class className{
constructor(){}
}
constructor为类的一个自带的构造函数,可以接收形参。constructor一般用于设置新建对象的属性,也可以设置方法,但是由于constructor设置的东西可以理解为设置在对象本身身上,所以每次新创建对象时有相同的方法,且占用不同的空间,造成内存浪费。在此构造函数外设置的除静态方法外的方法可以理解为挂载到了新建对象的原型对象上,所以公用的方法写在外面,节省内存。
class className{
constructor(name,age){
this.name=name;
this.age=age;
this.msg=function(){
console.log(111);
}
};
say(){
console.log("hello");
}
}
let p1=new className("hxf",20);
let p2=new className("cbw",20);
console.log(p1.say==p2.say);//true
console.log(p1.msg==p2.msg);//false
使用关键字static,将会使方法和属性变为静态的方法和属性,即会变成该类自身的属性和方法,将不会再被挂载到类的原型对象上去。即
class Person{
name:"123"
}
let p1=new Person();
p1.name=undefined
注意事项:
在使用类构造对象时,要注意属性和方法被挂载到了谁的身上,我们就能较为清晰的理解类。我的理解是constructor里面的的属性都被挂载到了新创建的对象上,所以在constructor中,this指向的是新创建的对象。而constructor外的属性和方法被挂载到了类的原型上,static修饰的属性和方法被挂载到了类本身身上。所以对于属性和方法的访问,有了以下的代码:
class className{
constructor(name,age){
this.name=name+className.sex;
this.age=age;
this.msg=function(){
console.log(111);
}
};
static sex="nan";
say(){
console.log("hello"+this.name);
}
}
let p1=new className("hxf",20);
let p2=new className("cbw",20);
// console.log(p1.sex)
console.log(p1.say())//hellohxfnan
console.log(p1.say==p2.say);//true
console.log(p1.msg==p2.msg);//false
关于this的指向问题请看我的上一篇文章。
类的声明是采用严格模式的。
类可以被继承,但是一个子类只有一个父类,而一个父类可以被多个子类继承。
class Father{
constructor(){
}
name="123";
say(){
console.log("hello");
}
}
class Son extends Father{
// constructor(){
// super();
// }
speak(){
console.log("world");
}
}
let p1=new Son();
p1.say();//hello
console.log(p1.name)//123
当子类继承父类的属性和方法时,需要调用自身constructor中的super()方法,若不写自身的constructor方法,也会被自动加上。当子类需要继承父类的constructor中的属性时,则需要向super中传入参数,且super的调用需位于自身属性之前。
class Father{
constructor(name1,age){
this.name1=name1;
this.age=age;
}
name="123";
say(){
console.log("hello");
}
}
class Son extends Father{
constructor(name1,age,sex){
super(name1,age);
this.sex=sex
}
speak(){
console.log("world");
}
}
let p1=new Son();
p1.say();//hello
console.log(p1.name)//123
let p2=new Son("cbw",20,"nan");
console.log(p2)//Son {name: '123', name1: 'cbw', age: 20, sex: 'nan'}