类和类的继承
一、类的声明
JS中到处都是对象,它是一门基于对象的语言,JS代码的执行都依托于对象,利用对象产生各种具备关联性的上下文环境,JS代码才能正常运行。
但是我们都知道在ES5中,没有class,我们只是利用函数、new关键词、原型等方式实现类的概念和基本使用,但是随着技术的发展和编程语言的互相靠拢,只使用构造函数或者工厂模式去实现类的封装调用很不现实,代码不明确,容易让学习者和开发者产生误会。
所以 ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。
基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
ES5声明类
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString = function () {
return '(' + this.x + ', ' + this.y + ')';
};
let p = new Point(3, 4);
ES6声明类
class Point {
// 构造函数
constructor(x, y) {
this.x = x;
this.y = y;
}
// 原型函数
toString = function () {
return '(' + this.x + ', ' + this.y + ')';
};
}
上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。也就是说,ES5 的构造函数Point,对应 ES6 的Point类的构造方法。
Point类除了构造方法,还定义了一个toString方法。注意,定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
ES6的类,完全可以看做构造函数的另一个写法:
class Point {
// ...
}
typeof Point // "function"
Point === Point.prototype