原型继承
+ 继承 => 涉及两个构造函数
+ 准备好的父类叫做Person
+ 准备好的子类叫做Student
+ 当完成继承以后,Student继承自Person
+ 那么s就可以使用name属性和sayHi方法
原型继承
== 就是通过改变原型链的方式来达到继承
== 子类.prototype = 父类的实例
原型继承缺点
1 我继承下来的属性没有继承在自己身上
== 而是在__proto__里面
== 当我访问的时候就要求__proto__里面找
2 我继承的目的是为了继承属性和方法
== 我自己要使用的name属性和age属性的值
== 自己要用的多个参数在多个位置传递
== 对于代码的维护和书写阅读都不是很好
特点: 子类利用原型来将父类里面的属性和方法继承一份,给子类来进行使用
优点: 可以将父类里面的属性和方法给继承一份下来,提供给子类来进行使用
缺点: 子类没有自己的原型,用的原型父类的原型的
// 1 准备一个父类
function Person(name){
this.name = name
}
// 原型上有一个方法
Person.prototype.sayHi= function(){
console.log('hi')
}
// 使用Person来实例化对象
let p = new Person('jack')
/*
p = {
name:'jack',
__proto__:{
sayHi:function(){}
}
}
*/
// console.log(p)
// 2 准备一个子类
function Student(age){
this.age = age;
}
// 让Student完成继承
Student.prototype = new Person('jack')
/*
Student.prototype = p = {
name:'jack',
__proto__:{
sayHi:function(){}
}
}
*/
// 使用Student来实例对象
let s = new Student('18')
/*
s = {
age:'18',
__proto__:Student.prototype:{
name:'jack',
__proto__:{
sayHi:function(){}
}
}
}
*/
console.log(s)
console.log(s.name)
s.sayHi()
/*
当你使用s去访问name属性的时候
+ 自己没有,去到__proto__上有
当你使用s去访问sayHi方法的时候
+ 自己没有,去到__proto__上还没有
+ 就再去__proto__上找,就有了
*/