条件: A父类 、 B子类 、B类要继承A类

什么是原型链继承?

原理:将B类的原型对象 重写成父类A的一个实例 B.prototype = new A()

特点:将父类的私有属性和公有属性,都继承给自己的原型属性

1.请看代码示例:

  1. function A {
  2. //给当前实例添加私有属性text
  3. this.text = 'A类text'
  4. }
  5. A.prototype.age = 19
  6. A.prototype.say = function(){
  7. console.log('a类原型say')
  8. }
  9. function B (){
  10. }
  11. //将B类型对象改写为 A 实例
  12. //{text:'a类text',__proto__:A.prototype}
  13. let obj = new A();
  14. B.prototype = obj
  15. B.prototype.constructor = B;
  16. const b = new B()
  17. //实例b 使用A类的属性方法
  18. console.log(b.__proto__ === B.prototype)//true
  19. console.log(obj === B.prototype)//true
  20. console.log(b.__proto__ === obj)//true
  21. b.text //=>b.__proto__ =>B.prototype => text ( B.prototype = obj A类给实例添加了text属性所以.prototype有text属性 )

2.请看代码示例:

  1. function Super() {
  2. this.name = 'super'
  3. }
  4. Super.prototype.age = 18
  5. function Sub() {
  6. }
  7. // Super 父类 Sub 子类
  8. // 原型链继承:将Super类的实例对象 改写为Sub类的原型对象
  9. // 把Super类上私有属性和公有属性,都继承为Sub类的原型属性
  10. Sub.prototype = new Super()
  11. Sub.prototype.constructor = Sub
  12. console.log(Sub.prototype instanceof Super) // true
  13. let s = new Sub()
  14. console.log(s.name)//super
  15. console.log(s.age)//18
  16. console.log(Sub.prototype instanceof Super)//true
  17. console.log('通过子类查找父类属性方法', Sub.prototype.__proto__.age)//18
  18. // 子类重写父类 会影响到父类的所有实例
  19. Sub.prototype.__proto__.age = 38
  20. console.log(Super.prototype)//{name:'super',__protot__:Super.prototype}
  21. let a1 = new Super()
  22. console.log(a1.age)//38