es6之前没有提供extends关键字用于类的继承,但是可以通过构造函数+原型对象模拟实现继承,被称为组合继承
组合继承分为两步:
- 一是属性的继承,在构造函数中添加改变this指向的call()方法让父类的this指向子类
- 二是方法的继承,将父类的实例赋值给子类的的原型对象(prototype),再将子类原型对象上的构造器(constructor)指回子类
属性继承示例
Father.call(this,...) 在子类构造器中使用,使得父类的this指向子类
// 属性继承:
// 在子类调用父类函数,用call改变this指向
function Father (uname, age) {
this.uname = uname;
this.age = age;
}
var o = new Father('张三丰', 22);
//console.log(o);
// 继承
function Son (uname, age, score) {
// this指向不同
// Father(uname, age);
// 如果调用Father函数,并且能够把Father里面的this指向儿子的实例对象
Father.call(this, uname, age);
this.score = score;
}
var obj = new Son('儿子', 19, 66);
console.log(obj);
方法继承示例
将父类的实例赋值给子类的原型对象,这时候父类的实例开辟了新的内存空间,使得继承不会影响原来的父类原型对象,且父类实例拥有父类的方法,赋值过去后,子类拥有了父类的方法,实现继承后,需要将子类原型对象上的构造器(constructor)指回子类
// 方法继承
function Father () {}
Father.prototype.say = function () {
console.log('say方法');
}
// 继承
function Son () {}
// 如果继承下来父类的方法啦,那么要再子类的原型对象
// 父实例对象赋值给子原型对象,指回构造函数本身
Son.prototype = new Father();
// Son.prototype.chi = function () {
// console.log('吃饭');
// }
//子类原型对象上的构造器指回子类
Son.prototype.constructor = Son;
console.log( Son.prototype );
//console.log( Father.prototype );
var obj = new Son();
//obj.say();
//obj.chi();
// console.log( obj );