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。