es6 - 类

es6 类-class

与大多正规的面向对象编程言语差异(比方java),js在建立之初就不支撑类。js的面向对象编程完成体式格局是经由过程组织函数和原型来完成的。

我之前认为es6引入类的观点将会带给这门言语极大的转变。厥后才发明es6类的特征只是一种语法糖,使得js建立自定义范例和传统的面向对象言语语法上越发相似,其内部机理和之前组织函数-原型情势本质上是一样的。然则,es6 类的特征依然是值得控制的,它使得js言语越发的严谨,消除了一些能够致使失足的状态。

语法

类的建立依赖于class和constructor两个关键字,下面引见下类建立的语法。

建立自定义范例

看下面一段代码:

class Person{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    sayName(){
        console.log(this.name);
    }
}

上面代码运用class建立了一个自定义范例Person,constructor是这个类的组织器,sayName是类的大众要领。它和下面一段代码是等价的。

function Person(name, age){
    this.name = name;
    this.age = age;
}
Person.prototype.sayName = function(){
    console.log(this.name);
}

两者在运用上完全相同,比方:建立一个Person的实例 new Person('icode007')等。一些小的差异主要有下面几点:

  • 运用class建立的类只能运用new来挪用,而后者能够作为一般函数挪用。
  • class没有声明提拔,后者作为函数会有声明提拔。
  • 类声明中的代码自动运行在严厉情势下。
  • 类的一切要领都是不可枚举的。

类表达式

与函数相似,类也具有两种情势,类声明和类表达式。

let Person = class{
    constructor(name, age){
        this.name = name;
        this.age = age;
    }
    sayName(){
        console.log(this.name);
    }
}

let person = new Person('icode007');

类表达式在运用上与类声明几乎没有区分。

类的接见器属性

运用get和set关键字可认为类定义接见器属性。

let Person = class{
    constructor(firstname, lastname){
        this.firstname = firstname;
        this.lastname = lastname;
    }
    get fullname(){
        return this.firstname + this.lastname;
    }
    set fullname(name){
        var arr = name.split(' ');
        this.firstname = arr[0];
        this.lastname = arr[arr.length - 1];
    }
}
let person = new Person('nicholas', 'zakas');
console.log(person.fullname);

类的静态成员

要定义类的静态要领,只须要在大众要领定义前加static关键字即可。如:

let Person = class{
    constructor(firstname, lastname){
        this.firstname = firstname;
        this.lastname = lastname;
    }
    static getFullname(){
        return this.firstname + this.lastname;
    }
}

要运用该静态要领,须要直接在类上挪用,比方Person.getFullname()

类的继续

es6的类运用extends来完成继续。比方:

class Rectangle{
    constructor(length,width){
        this.length = length;
        this.width = width;
    }
    getArea(){
        return this.length * this.width;
    }
}

class Square extends Rectangle {
    constructor(length){
        super(length, length);
    }
    getPerimeter(){
        return this.length * 4;
    }
}
var sqr = new Square(5);
console.log(sqr.getArea()

上面代码中,类Square继续了Rectangle类,所以实例sqr一样具有getArea()要领。 同时sqr添加了本身的getPerimeter要领。并重写了组织器constructor。

注重事项

在运用类继续的完成中,须要注重的点是:

  • 假如子类没有重写constructor要领,默许会挪用父类的组织器要领。
  • 假如重写了constructor要领,那末须要显式的挪用父类的组织器要领,即super(arg...),而且super()挪用一定要放到组织器的最前面(正确的说是在运用this前须要挪用super)。
  • 父类的静态成员一样会被继续到子类上。

最好实践

es6的类的语法比较易于控制,推荐在现实开辟中,多运用class来建立自定义范例。 起首会使关于类的信息都包裹在一个class{}中,也会使得js中的类与其他言语的类的语法越发的一致。

更多关于es6的内容,能够关注右边专栏 – 进修ES6。

    原文作者:charsandrew
    原文地址: https://segmentfault.com/a/1190000013661604
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞