ES6中新增的class、constructor、static、extends、super

// 私有属性, 公有属性, 静态属性 (函数属性)
class Plane {
    static alive () {
        return true;
    }

    constructor (name, blood) {
        this.name = name || '普通飞机';
        this.blood = blood || 100;
    }

    fly () {
        console.log('fly');
    }

};
ES6中class内只能声明上面三种类型属性.
1.
    static alive () {
        return true;
    }
    这种声明静态属性的方式相当于 
    Plane.alive = function(){
        return true;
    };
其实就是在Plane这个对象上加的属性。该属性规定必须是一个方法。
2.
    constructor (name) {
        this.name = name || '普通飞机';
    this.blood = blood || 100;
    }
    这种相当于 
    function Plane(){
        this.name = name || '普通飞机';
        this.blood = blood || 100;
    }
     添加的是私有属性。
3.
    fly () {
        console.log('fly');
    }
    相当于Plane.prototype.fly = 
    function(){
        console.log('fly');
    }
    是在Plane原型链上加的属性。该属性规定也必须是一个方法。不然经过babel编译降级成ES5后会报错。

ES7中对class又有扩展。
class AttackPlane extends Plane{
    constructor (name,blood) {
        super(name,blood);
        this.logo = 'duyi';
    }
    dan () {
        console.log('biubiubiu');
    }
}
1.
使用extends关键字后,Plane原型链上的方法就会继承给AttackPlane,即fly方法继承给AttackPlane。
Plane上的静态属性方法 alive也继承到了Attack Plane对象的静态属性上。

2.
super(name,age)执行后会继承Plane中的私有属性,即name、blood属性。
相当于Person.call(this,name,age);



this.logo = 'duyi'这是AttackPlane自己才有的私有属性。

dan也是AttackPlane自己才有的属性方法。

注意点:

1.class底层其实相当于ES5中的构造函数,但是不能直接像函数那样执行一个class,如 下代码会报错

Plane();

 必须通过new来构造出一个对象。

new Plane();

2.Plane.prototype对象上的属性是不能枚举的,如下代码不会输出fly:

for(var prop of Plane.prototype){
    console.log(prop);
}

3.static声明的静态属性是直接放到Plane对象上的,必须要通过Plane.alive()这样的形式去调用。

你可能感兴趣的:(ES6中新增的class、constructor、static、extends、super)