方法1:
class中的 constructor 属性
在使用new 创建实例化对象的时候 constructor 的 this 属性会
继承到 实例化对象中
方法2:
创建2个class 对象
class 子对象 extends 父对象
既然都要用到了类class,那么先来了解class:
class 的本质是 function。
它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。
class Test {
constructor(){
this.a = 1;
}
}
var xxx= new Text(); ⇒ xxx = { a:1 }
注意事项:
①类定义不会被提升,这意味着,必须在访问前对类进行定义,否则就会报错。
②类中方法不需要 function 关键字。
③方法间不能加分号。
第一种继承方式
步骤:
①创建一个对象;
②将构造函数的作用域赋值给新对象(因此this就指向了这个新对象);
③执行构造函数中的代码(为这个新对象添加属性);
④返回新对象
class Text{
constructor(a,b){
this.a=a;
this.b=b;
}
hello(){
console.log('hello class')
}
}
Text.prototype.c = 3
var classA = new Text(1,2)
结果
①constructor中的this都继承到了这个实例化对象中,
②constructor外的方法都继承到了这个实例化对象中 ,但只能 通过__proto__找到,
③porototype原型上面的属性也继承到了这个实例化对象中(和函数类似),__proto__找到,
classA ==>{a:1,b:2 }
它的__proto__上:有 hello() 和 c属性
第二种继承方式
第一种情况:子类没constructor属性时
class father{
aaa(){
console.log(this.a+' '+this.b);
}
}
class son extends father{
}
①子类son继承父类father,子类没用定义constrcutor,则默认添加一个,
②在constrcutor中调用super函数,相当于调用父类的构造函数。
③调用super函数是为了在子类中获得父类的this,调用之后this指向子类。
第二种情况:子类有constructor属性时
class father{
constructor(a,b){
this.a=a;
this.b=b;
}
aaa(){
console.log(this.a+' '+this.b);
}
}
class son extends father{
constructor(a,b){
super(a,b);
this.c=c;
}
bbb(){
console.log(this.a+' '+this.b+''+this.c);
}
}
注意事项:
①子类 constructor 方法中必须有 super ,且必须出现在 this 之前。
②super()中继承的参数和父类的保持一致。
③如果不调用super函数,子类就得不到this对象。super()作为父类的构造函数,只能出现在子类的constructor()中
④super指向父类的原型对象,可以调用父类的属性和方法。
封装
class Text{
constructor(a, b) {
this.a = a;
this.b = b;
}
get a(){
return this.a;
}
set a(a){
this.a = a;
}
}
注意事项:
①getter 不可单独出现
②getter 与 setter 必须同级出现
③ 实例化时调用 set 方法 参数写入的时候
④读取时自动调用get方法