JS-15 (class)

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
原文地址:https://www.cnblogs.com/codexlx/p/12488387.html