ES6 面向对象 class 类

新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

传统的写法


class ES6新写法


ES6的类,完全可以看作构造函数的另一种写法

constructor中的属性和方法会自动调用,sayName中的方法会挂载到原型上,实现共享

注意:class没有提升

私有方法:

_bar(baz) {
    return this.snaf = baz;
}

上面代码中,_bar方法前面的下划线,表示这是一个只限于内部使用的私有方法。但是,这种命名是不保险的,在类的外部,还是可以调用到这个方
法。

class 里的继承 extends super

extends [iksˈtendz] 延长延续

语法:

class Cat extends Animal{}

定义一个Cat类,该类通过extends关键字,继承了Animal类的所有属性和方法。

例子

class Cat extends Animal{
    constructor(x,y,name){
        super(x,y);
        this.name=name
    }
}

注意:

子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。

ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.apply(this))。

ES6 的继承机制完全不同,实质是
先创造父类的实例对象this(所以必须先调用super方法),然后再用子类的构造函数修改this。

静态方法 static

class People {
    static print(){
        console.log(100)
    }
}

var p = new People();

p.print()//报错

所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承。而是直接通过类来调用,这就称为“静态方法”

这能这样调用
People.print();

父级的静态方法可以被子级继承

继承后子级可以调用父级的方法

class Foo {
    static classMethod() {
        console.log('我被继承了');
    }
}
class Bar extends Foo {
}

Bar.classMethod(); 

ES6规定class只有静态方法没有静态属性。

你可能感兴趣的:(ES6 面向对象 class 类)