一,什么是继承
是构造函数之间的相关应用
继承的是属性和方法
是子集从父级继承
常见的继承方法有,原型继承,构造函数继承,es6继承
二,构造函数
es5定义构造函数
// 构造函数
function Father(name,age){
this.name=name
this.age=age
}
Father.prototype.fun1=function(){
console.log(this.name,this.age)
}
Father.prototype.fun2()=function(){
console.log(123)
}
es6继承的方法
function Father(name,age){
this.name=name
this.age=age
}
class Son extends Father{
//constructor构造器
constructor(name,age,sex){
//在父级继承的属性要写在super中
super(name,age)
this.sex=sex;
}
//定义方法
f(){
console.log(this.name,this.age,this.sex)
}
}
// 通过构造函数来生成实例化对象
const s=new Son("张三","18","男")
s.f()//执行实例化对象s中的f函数
// new的三个步骤
// 1,生成一个实例化对象
// 2,执行实例化对象中的函数
// 3,改变this指向
三,原型属性和原型对象
1,每个对象都有一个 __proto__原型属性
2,每个函数都有一个 prototype 原型对象
万物皆对象所以任何数据类型都有proto原型属性
四,原型链
实例化对象中的proto指向构造函数的prototype
一直与上一级形成数据链
最后指向js的顶级对象object
五,构造函数和实例化对象
构造函数时专门生成实例化对象的函数
一般和new关键词使用 new关键词定义并且返回一个对象,作为构造函数的返回值,所以定义构造函数时,不要定义返回值
实例化对象就是通过构造函数生成的对象
六,构造函数定义函数的属性和方法
七,原型继承
原型继承主要继承方法
继承时两个构造函数之间的应用
两个构造函数通过原型链进行串联
两个构造函数生成的实例化对象,将两个构造函数,形成一个原型继承
原型继承
定义父级构造函数,使用父级构造函数,生成实例化对象
定义子级构造函数
子级构造函数.prototype=父级构造函数的实例化对象
原型继承最主要的是继承方法
八,借用构造函数继承(主要是继承属性,没有继承方法)
构造函数中的this指向的是生成的实例化对象
function Father(name,age){
this.name=name;
this.age=age;
}
Father.prototype.fn=function(){
console.log(this.name,this.age)
}
function Son(sex){
Father.call(this,"zhangsan","18")
this.sex=sex
}
const s=new Son("nan")
console.log(s)
主要通过.call方法在子级构造函数中调用父级构造函数
并且将父级的构造函数this指向改变成当前的子级构造函数
父级构造函数原始的this指向是指向生成的实例化对象
当前要让father的this指向son这个子级构造函数,也就是子级构造函数生成的实例化对象
bind,call,apply的区别
bind不会执行绑定的函数
call和apply会执行函数,并且第二个参数是传的参数
九,组合继承
就是原型继承的方法和构造函数继承的属性结合在一起,继承父级的方法和属性
总结
所谓的继承就是为了优化代码
继承是两个构造函数之间的应用,不用重复定义,达到了,优化代码,优化程序的作用
es5的继承有三种,原型继承继承方法,构造函数继承,继承属性,组合继承j继承属性和方法
一般使用es6继承,可以继承属性和方法class extends constructor super