Class 类
介绍:
在我们Js编程语言ES6之前,我们是没有Class类的概念的,但是其他很多的编程语言 eg:Java c c+,很早之前就实现了这种概念。我们在之前一直是使用构造函数和原型prototype来模拟面向对象编程的过程。
什么是Class类?
在ES6中,class (类)作为对象的模板被引入,可以通过 class 关键字定义类。它可以被看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。
类实际上是个“特殊的函数”,就像你能够定义的函数表达式和函数声明一 样,类语法有两个组成部分:类表达式和类声明。
注意:
Class类内部的模块,默认为严格模式,所以无需use strict 来执行严格模式。
Class类的语法:
1.定义一个类的一种方法是使用一个类声明,即用带有class关键字的类名,函数名和实例化构造名相同且大写(非强制)。
class Person {
constructor(x, y) {
this.x = x
this.y = y
}
toString(){
// ...
}
toValue(){
// ...
}
}
//constructor 就是我们类中的构造函数,对应Es5中的构造函数
//this关键字指向实例对象;
//定义class类方法时,无需加function关键字;
//定义function方法时,无需加‘,’,否则会报错;
2.函数声明和类声明之间的一个重要区别是函数声明会提升,类声明不会。需要先进行声明,再去访问,否则会报错。
var person=new Person()
class Person {
constructor(x, y) {
this.x = x
this.y = y
}
}
// Person is not defined
3.构造函数的prototype属性,在ES6的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面。
class Person {
constructor(){
// ...
}
toString(){
// ...
}
toValue(){
// ...
}
}
//等同于
Person.prototype={
toString(){
// ...
},
toValue(){
// ...
}
}
4.Object.assign方法可以很方便地一次向类添加多个方法。
class Point {
constructor(){
// ...
}
}
Object.assign(Point.prototype, {
toString(){},
toValue(){}
});
//等同于
class Point {
constructor(){
// ...
}
toString(){}
toValue(){}
}
5.类的内部所有定义的方法,都是不可枚举的(non-enumerable)。这一点与ES5的行为不一致。
6.类的属性名,可以采用表达式
let methodName = "getArea";
class Square{
constructor(length) {
// ...
}
[methodName]() {
// ...
}
}
//上面代码中,Square类的方法名getArea,是从表达式得到的。
7.constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
class Point {
//此时这里并没有constructor构造函数
toString(){}
}
//会被默认添加成以下
class Point {
constructor(){
}
toString(){}
}
8.类的构造函数,不使用new是没法调用的,会报错。
class Point {
constructor(){
}
toString(){}
}
Point.constructor() //报错
//正确的是:
var a=new Point()