继承
ES6之前并没有给我们提供extends继承。我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承。
call()
调用这个函数, 并且修改函数运行时的this 指向
fun.call(thisArg, arg1, arg2, ...);call把父类的this指向子类
thisArg :当前调用函数this的指向对象
arg1,arg2:传递的其他参数
利用构造函数实现子类的继承:
属性的继承
<script>
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
function Star(name, age, sex, hair) {
// 属性的继承 用父类调用call方法,改变当前this的指向就可以
Person.call(this, name, age, sex);
this.hair = hair;
}
var lyf = new Star("刘亦菲", 20, "女", "长头发");
console.log(lyf);
</script>
方法的继承
实现方法把父类的实例对象保存给子类的原型对象
一般情况下,对象的方法都在构造函数的原型对象中设置,通过构造函数无法继承父类方法。核心原理:
①将子类所共享的方法提取出来,让子类的prototype 原型对象= new 父类()
②本质:子类原型对象等于是实例化父类,因为父类实例化之后另外开辟空间,就不会影响原来父类原型对象
③将子类的constructor指回子类构造函数本身
方法继承:把父类的实例对象赋值给子类的原型对象,再用contructor指回子类构造函数本身
<script>
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
Person.prototype.sing = function() {
console.log("唱歌");
}
function Star(name, age, sex, hair) {
Person.call(this, name, age, sex);
this.hair = hair;
}
// 继承方法:把父类的实例对象,赋值给子类的原型对象
Star.prototype = new Person();
Star.prototype.contructor = Star;
var lyf = new Star("刘亦菲", 20, "女", "长头发");
console.log(lyf);
lyf.sing();
</script>
注意:一定要让Son指回构造函数
实现继承后,让Son指回原构造函数
Son.prototype = new Father();
Son.prototype.constructor = Son;
总结:用构造函数实线属性继承,用原型对象实线方法继承
ES5:组合继承,构造函数和原型对象
属性继承:调用父类函数,用call改变this指向
方法继承;把父类的实例对象赋值给子类的原型,用contructor指回子类构造函数本身