es6中的类
ES6 中的类实际上就是个函数,而且正如函数的定义方式有函数声明和函数表达式两种一样,类的定义方式也有两种,分别是:类声明、类表达式。
类声明是定义类的一种方式,就像下面例子这样,使用关键字class后跟一个类名(这里是 person),就可以定义一个类了
eg:
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
类声明和函数声明不同的一点是,函数声明存在变量提升,而类声明不会。
也就是说,你需要先声明这个类,然后才能使用它,否则代码会抛出 ReferenceError 异常。
像下面这样:
var p = new Person(); // ReferenceError错误
class Person {}
正确:
class Person {
constructor(name) {
this.name = name;
}
}
var p = new Person("xiaowang");
p.age=29;
类表达式是定义类的另外一种方式,就像函数表达式一样,在类表达式中,类名是可有可无的。
如果定义了类名,则该类名只有在类体内部才能访问到。(类的成员需要定义在一对{} 里,{}里的代码和其本身就组成了类体。)
// 匿名类表达式
var Person = class {
constructor(name) {
this.name= name;
}
};
// 命名类表达式
var Person = class Person
{
constructor(name) {
this.name = name;
}
};
注意: 类表达式和类声明一样也不会有提升的现象。
构造函数(找时间在仔细总结一份构造函数的文章)
类的成员需要定义在一对{} 里,{}里的代码和其本身就组成了类体。
类成员包括类构造器和类方法(包括静态方法和实例方法)。
class 根据 constructor 方法来创建和初始化对象。constructor方法是类的默认方法=>当你通过new命令生成对象实例时,就会自动调用该方法。
注意*一个类只能有一个constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
constructor() {}constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
class Foo {
constructor() {
return Object.create(null);
}
}
var foo =new Foo();
foo instanceof Foo // false
[instanceof运算符可以用来判断某个构造函数的prototype属性是否存在于另外一个要检测对象的原型链上。 ]
上面代码中,constructor函数返回一个全新的对象,结果导致实例对象foo不是Foo类的实例。constructor 方法是一个特殊的类方法,它既不是静态方法也不是实例方法,它仅在实例化一个类的时候被调用。一个类只能拥有一个名为 constructor 的方法,否则会抛出 SyntaxError 异常。
使用 extends 关键字创建子类
extends 关键字可以用来创建继承于某个类的子类。
这个例子是根据名为Animal类创建一个名为Dog的类。
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ' makes a noise.');
}
}
class Dog extends Animal {
speak() {
console.log(this.name + ' barks.');
}
}
var dog = new Dog('NiNi');
dog.speak();