1.类是什么?
在面向对象编程中(OOP)中,一个类顶定义了一个对象的特征。类是定义对象属性和方法的模板,是用来绘制具体对象实例的“蓝图”。
2.类与构造函数的比较
// 构造函数:初始化、添加方法和继承
function Hero(name, level) {
this.name = name;
this.level = level;
}
Hero.prototype.greet = function() {
return `${this.name} say hello`
}
function Mage(name,level, spell) {
Hero.call(this, name, level);
this.spell = spell;
}
// 类:初始化、添加方法和继承
class Hero {
constructor (name, level) {
this.name = name;
this.level = level;
}
greeting() {
return `${this.name} say hello`
}
}
class Mage extends Hero {
constructor(name, level, spell) {
super(name, level);
this.spell = spell;
}
}
ES6 的 class 可以看作一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。但值得注意的是,类的内部中所有定义的方法,都是不可枚举的,同时,类在底层还是使用了JS的函数和原型链
3.JS中使用Class的坑
- 对
this
指向进行确定,当然可以使用bind
函数来确定,但当这种方法很多的时候,会显得构造函数非常臃肿; - 使用类属性+箭头函数的方式来定义方法时,该方法不在原型链上,同时每创建一个对象实例将会创建该方法,将会造成性能浪费
- 可以利用工厂模式解决
4. class相关的知识点
- 一个类中只能存在一个
constructor
方法 - 一个构造函数可以使用
super
来调用一个父类的构造函数 static
:调用静态方法不需要实例化该类,也不能通过该类实例调用静态方法,它通常用于创建工具函数- 当调用静态或原型方法时没有指定
this
的值,则方法内的值将被设置为undefined
两篇好文:
ES6 系列之 Babel 是如何编译 Class 的(上)
ES6 系列之 Babel 是如何编译 Class 的(下)