ES6(六)--class的基本使用
js的传统方法是通过构造函数,定义并生成新对象,是一种基于原型的面向对象系统,在ES6中新增了类的概念,可以使用class
关键字声明一个类,之后以这个类来实例化对象。
生成实例对象的传统方法
const Obj = function (a, b) {
this.a = a;
this.b = b;
return this;
}
Obj.prototype = {
constructor: Obj,
print: function () {
console.log(this.a + " " + this.b);
}
}
new Obj(1, 2).print();//1 2
生成实例对象的class
类
class Obj {
constructor(a, b) {
this.a = a;
this.b = b;
}
print() {
console.log(this.a + " " + this.b);
}
}
new Obj(1, 2).print();//1 2
上面定义了一个Obj
类,其中constructor
方法就是构造方法,this
代表实例对象。也就是说ES5中的Obj
构造函数相当于ES6中Obj
类的构造方法。
除了构造方法,Obj
类还定义了一个print
方法,注意方法之间不用加逗号,
,不是一个JSON
。
上面的两个例子是一样的,ES6中的class
只是一种语法糖,Obj
类上的方法仍然是定义在prototype
上面,所以在类上调用类的方法其实就是调用原型上面的方法,如下
class A {
constructor() {
}
print() {
}
};
let b = new A();
console.log(b.print() == A.prototype.print());//true
b.constructor === A.prototype.constructor; // true
其实constructor
构造方法并不是必须的,当不需要传入参数的时候可以省略,如果省略构造方法,在运行代码的时候js引擎会自动添加一个构造方法
class a {
constructor() {}
}
//等价于
class a {}
注意一点,类内部定义的方法都是不可以枚举的
class A {
constructor() {
}
print() {
}
};
console.log(Object.keys(A.prototype));//[]