ES5中,生成对象通过构造函数:
1 function A(name,age){
2 this.name=name;
3 this.age=age
4 }
5 // 在A的prototype属性上定义一个test方法,即A生成的实例化对象的原型对象上的方法
6 A.prototype.test=function(){
7 return this.name+' '+this.age
8 }
9
10 var a1=new A('apple',100)
11 console.log(a1.test())//apple 100
在es6中,引入了class关键字,上面代码等价于下面:
1 class B{
2 constructor(name,age){
3 this.name=name
4 this.age=age
5 }
6 test(){
7 return this.name+' '+this.age
8 }
9 }
10 var b1=new B('apple',100)
11 console.log(b1.test())//apple 100
需要注意的一点是:类和模块中默认使用的就是严格模式
class中的静态方法:static
1 class C{
2 //没有写上constructor,默认会生成一个空的构造函数
3 static foo(){//注意:class里面函数不用添加function;
4 // 函数前面添加一个static关键字,表明这是一个静态方法,不会被实例继承,只能通过类来调用
5 console.log(100)
6 }
7 }
8 let c1=new C()
9 // c1.foo()报错
10 C.foo()//100
继承:class可以通过extends关键字继承,对比es5修改原型链简单直观方便许多
注意:子类中如果写了构造函数contructor,那么一定要在里面使用super方法,同时只有使用了super方法才能使用this!当然如果没有构造函数,那么默认会生成一个构造函数
1 class D{
2 constructor(age,email){
3 this.age=age
4 this.email=email
5 }
6 static test(){
7 console.log(10)
8 }
9 }
10 class E extends D{
11 constructor(age,email,weight){
12 super(age+'E',email+'E')//这里的super指向的是父类
13 this.weight=weight
14 }
15 }
16 let e1=new E(10,'100@qq.com',100)
17 console.log(e1)//E {age: "10E", email: "100@qq.comE", weight: 100}
18 E.test()//10,说明父类的静态方法可以被子类继承;但同理实例对象无法访问
19 // e1.test()//报错