构造函数的继承
继承:通过“某一种方式”让一个对象,可以访问并使用到另一个对象中的内容。
这种行为我们叫做 继承!
继承的作用: 节省了各个构造函数中,大量重复声明的属性和方法。
提高了开发效率,并节省了内存
继承的方式一: call和apply方法的使用 ,达成了构造函数继承的作用
构造函数的继承: 优点 简约易使用
缺点 只可以继承(借用) 构造函数中的内容
无法继承(借用) 原型中的内容
function fn(){
console.log(this);
}
function Animal(name,sex){
this.name = name;
this.sex = sex;
this.jiao = function(){
console.log(this);
}
}
直接给原型赋值一个对象,可以简化批量赋值。 但,等于重构了原型
重构原型时,需要手动创建constructor: 构造函数。 否则原型的指向链条会断
Animal.prototype = {
constructor:Animal,
ll:"lala",
fun:function(){
console.log("我是原型中方法");
}
};
let obj = new Animal("猴子","公");
// obj.jiao();
fn();
call: 对象冒充, 又叫做对象借用
fn.call(obj,"大象","公");
function Tiger(name,age,sex,hobby){
// this.name = name;
// this.sex = sex;
// this.jiao = function(){
// console.log(this);
// }
Animal.call(this,name,sex);
this.age = age;
this.hobby = hobby;
}
apply:作用和call 一致, 都借用对象。
区别: call 接受参数时,数量根据被借者需要的参数而定
apply: 只有两个参数 1.借用者 2.数组(这里存放着所有的参数)
function Person(name,age,sex,hobby){
let arr = [name,age,sex,hobby];
Tiger.apply(this,arr);
}
}
let tiger = new Tiger("老虎","18","公","吃水果");
tiger.jiao();
console.log(tiger.name);
let per = new Person("小四","18","待定","打篮球");
per.jiao(); // 构造函数继承,只可以继承(借用) 构造函数中的内容
原型链继承
父类
function Parent(name,age){
this.name = name;
this.age = age;
}
Parent.prototype.love = function(){
console.log("喜欢小孩");
}
let par = new Parent("哈","50");
子类
function D(name,sex,age){
//构造函数继承,又叫类式继承
Parent.call(this,name,age);
this.h = "d";
}
原型链继承: 将父类的实例化对象 赋值 给子类的原型
优点:类似于复制了一个对象,构造函数和原型中所有的数据都可以获取到。简约方便使用
缺点:
1.原型链继承自身没有办法传参。
2. 父类所有的属性和方法都可以被所有子类共享
D.prototype = new Parent()
组合继承: 类式继承,无法获取父类的原型链
原型链继承,无法直接给父类传参
组合继承 = 类式继承 + 原型链继承
结合了两种继承的优点,互相弥补了各自的缺点
let d = new D("小小","男","20");
console.log(d.name);
d.love();