假设原型链的终点 Object.prototype 为原型链的 E (end)端,原型链的起点为 S 端,通过前面原型的学习我们知道,处于 S 端的对象,可以通过S - E 的单向查找,访问原型链上的所有方法与属性。这给继承提供了理论基础,我们只需要在 S 端添加新的对象,新的对象就能够通过原型链的访问到父级的方法与属性。因此要想实现继承,则也是一件非常简单的事情。
因为封装一个对象是由构造函数与原型共同组成的,所以继承也被分为有构造函数的继承与原型的继承两种。
假设已经封装好了一个父类对象Person,如下所示
var Person = function(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.getName = function() {
return this.name;
}
Person.prototype.getAge = function() {
return this.age;
}
构造函数的继承比较简单,可以借助 call/apply来实现。假设想要通过继承封装一个Student的子类对象,那么构造函数的实现如下所示
var Student = function(name, age, grade) {
Student.call(Person, name, age);
this.grade = grade;
}
// 等价于
var Student = function(name, age, grade) {
this.name = name;
this.age = age;
this.grade = grade;
}