ECMAScript 2015 中引入的 JavaScript 类 实质上是 JavaScript 现有的基于原型的继承的语法糖。类语法不会为JavaScript引入新的面向对象的继承模型。在JavaScript当中,类有基类(BaseClass)、超类(SuperClass)、父类和子类。所有的类别都是基于基类,而子类的父类被称为超类。
类实际上是个“特殊的函数”,就像你能够定义的函数表达式和函数声明一样
class Box{
a=1;//ES7支持
constructor(a,b){
// 构造函数
// this.a=1;
console.log(a+b);
}
// 类中的play方法
play(){
}
}
通过new一个类名可以将类实例化,当实例化时执行构造函数constructor,而对象的构造函数就是当前的类名,因为这个类需要实例化为对象时,必须先执行构造函数
let b=new Box();
b.constructor===Box;
有些语言的构造函数可以有多个,原生js中,构造函数只能有一个,并且所有类的构造函数写为constructor函数,且这个构造函数实际就是当前的类名
正因为js中构造函数就是类名,因此我们可以根据对象的构造函数是否是某个类名来判断他是否属于该类
var arr=new Array(1,2,3);
console.log(arr.constructor.name);//构造函数有一个name属性就是这个类的类名
console.log(arr.constructor===Array);
var date=new Date();
console.log(date.constructor===Date);
var reg=/a/g;
console.log(reg.constructor===RegExp);
类中除了函数中局部变量就是类中属性,类中的this就是实例化的对象。
用一个通俗的例子“造人”来类比实例化类:
//用class创建一个类:人类
class 人类{
// 人类有眼睛等属性
眼睛=2;
嘴巴=1;
耳朵=2;
鼻子=1;
手=2;
脚=2;
名字;
constructor(_name){
this.名字=_name;
}
//人类拥有走、跑等方法技能
walk(){
console.log(this.名字+"走")
}
run(){
console.log(this.名字+"跑")
}
eat(){
console.log(this.名字+"吃")
}
fire(){
console.log(this.名字+"生火")
}
}
//通过人类模板new一个亚当、一个夏娃,都拥有人类的属性方法
var 亚当=new 人类("亚当");
亚当.eat(); //亚当吃
亚当.run(); //亚当跑
var 夏娃=new 人类("夏娃");
夏娃.run(); //夏娃跑
夏娃.fire(); //夏娃生火
通过构造函数实例化的对象,就是这个类的实例对象,因此这个实例对象就具备了类所有属性和方法,这个实例对象就可以调用他自身的方法和属性了
构造函数默认生成实例化对象,因此不能在构造函数中使用return返回其他内容,构造函数不允许写return,谁调用方法,在类的函数中this就是那个实例对象
类可以通过extends来继承:
// 让Box1这个类继承了Box2的类
class Box1 extends Box2{
constructor(r){
// 继承父类后,必须在构造函数中调用超类的构造函数
super();//超类的构造函数,超类是什么,这个就是什么
}
}