ES6中新增的创建一个类型的新关键词
原js中一个类型,一定是两部分,而不仅仅是一个对象:
①构造函数:负责定义该类型将来所有子对象的统一属性解构,同时负责创建子对象;
②原型对象:负责替将来这个类型的所有子对象保存共有的属性和方法定义。
构造函数和原型对象是分开定义的。
class:包裹原来的构造函数和原型对象。
步骤
①用class{}包裹原来的构造函数和原型对象;
②将构造函数名提升为整个class的名字,今后所有构造函数统一命名为constructor;
③所有原型对象方法,直接放在class中,不用加类型名.prrototype.方法名
class Student{ constructor(sname,sage){ this.sname=sname; this.sage=sage; } intr(){ console.log(`I'm ${this.sname}, I'm ${this.sage}`); } intr2(){ console.log(`我是 ${this.sname}, 今年 ${this.sage} 岁`); } } var xlx=new Student('x_l_x',18); xlx.intr(); xlx.intr2();
class的继承:
class依然可以使用Object.setPrototypeOf(子对象,父对象)
实际继承方案
class 子类型 extends 父类型{ //此时子类型有了一个super()方法,子类型中调用super()等效于调用父类型中的构造函数,来执行父类型中构造函数内的代码,
将父类型规定的属性解构,添加到未来的孙子对象中。不过需要险些super(),再写子类型自己的属性。即super()必须放在最开始的位置。 }
ES6实现两种类型的继承:
// ES6实现两种类型之间的继承 // 父类型(共有的属性和方法) class Enemy{ constructor(x,y){ this.x=x; this.y=y; } fly(){ console.log(`一个敌人当前位置${this.x},${this.y}`); } } // 子类型1 class Plane extends Enemy{ constructor(x,y,score){ super(x,y); this.score=score; } getScore(){ console.log(`击落一架敌机,获得${this.score}分`); } } // 子类型2 class San extends Enemy{ constructor(x,y,award){ super(x,y); this.award=award; } getAward(){ console.log(`击落一个降落伞,获得奖励${this.award}`); } } var p1=new Plane(100,100,10); var s1=new San(200,200,'1 live'); p1.fly(); //一个敌人当前位置100,100 p1.getScore(); //击落一架敌机,获得10分 s1.fly(); //一个敌人当前位置200,200 s1.getAward(); //击落一个降落伞,获得奖励1 live