条件: A父类 、 B子类 、B类要继承A类
什么是原型链继承?
原理:将B类的原型对象 重写成父类A的一个实例 B.prototype = new A()
特点:将父类的私有属性和公有属性,都继承给自己的原型属性
1.请看代码示例:
function A {
//给当前实例添加私有属性text
this.text = 'A类text'
}
A.prototype.age = 19
A.prototype.say = function(){
console.log('a类原型say')
}
function B (){
}
//将B类型对象改写为 A 实例
//{text:'a类text',__proto__:A.prototype}
let obj = new A();
B.prototype = obj
B.prototype.constructor = B;
const b = new B()
//实例b 使用A类的属性方法
console.log(b.__proto__ === B.prototype)//true
console.log(obj === B.prototype)//true
console.log(b.__proto__ === obj)//true
b.text //=>b.__proto__ =>B.prototype => text ( B.prototype = obj A类给实例添加了text属性所以.prototype有text属性 )
2.请看代码示例:
function Super() {
this.name = 'super'
}
Super.prototype.age = 18
function Sub() {
}
// Super 父类 Sub 子类
// 原型链继承:将Super类的实例对象 改写为Sub类的原型对象
// 把Super类上私有属性和公有属性,都继承为Sub类的原型属性
Sub.prototype = new Super()
Sub.prototype.constructor = Sub
console.log(Sub.prototype instanceof Super) // true
let s = new Sub()
console.log(s.name)//super
console.log(s.age)//18
console.log(Sub.prototype instanceof Super)//true
console.log('通过子类查找父类属性方法', Sub.prototype.__proto__.age)//18
// 子类重写父类 会影响到父类的所有实例
Sub.prototype.__proto__.age = 38
console.log(Super.prototype)//{name:'super',__protot__:Super.prototype}
let a1 = new Super()
console.log(a1.age)//38