- 原型链继承(prototype属性/直接继承prototype)
- 原型链就是一层一层向上找的过程
- 原型链继承就是利用了上面这种特性
重点:★让新实列的原型等于父类的实例。
特点:实例可继承的属性:
1.实例的构造函数的属性
2.父类的构造函数属性
3.父类原型属性
缺点:1.新实例无法向父类构造函数传参
2.继承单一
3.所有新实列都会共享父类实例的属性
(子级的任何原型属性修改,都会影响到父级原型属性)
在这的constructor不会指向自己
- 空对象作为中介
空对象,几乎不占内存
修改子级的对象,不会影响到父级
★constructor构造器都是指向自己的
- 构造函数绑定apply/call方法
重点:★用.call()和.apply()将父类构造数引入子类函数
特点:1.call,apply是用来改变this指向的,理解为是函 数自身的方法
2.只继承父元素构造函数的属性,没有继承父类原型
3.解决了原型链继承缺点1、2、3。
4.可以继承多个构造函数属性(call多个)
5.在子实例中可向父实例传参。
缺点:无法实现构造函数的复用(每次用每次都要重新调用)
call,apply区别
使用call方法来传参 一个一个的传参
使用apply方法来传参 需要传一个数组
- 组合继承也叫伪经典继承
重点:将原型链继承和构造函数继承组合在一块
原型链实现对原型属性和方法的继承
借用构造函数实现对实例属性的继承
特点:1.可以继承父类原型上的属性,可以传参,可复用。
2.每个新实例引入的构造函数属性是私有的。
缺点:调用了两次父类构造函数(耗内存)
子类的构造函数会代替原型上的那个父类构造函数。
- 拷贝继承
把父对象的所有属性和方法,拷贝进子对象
将父对象的prototype对象中的属性
拷贝给Child对象的prototype对象
function Person(){
Car.prototype.head=1;
Car.prototype.foot=2;
person.prototype.eat=function(){
document.write(`我会吃饭`)
}
function Student(){}
function extend(child,parson){
for(let key in parson.prototype){
child.prototype[key]=parson.prototype[key];
}
}
extend(Student,Person)
let bl=new Student();
bl.eat();