继承的目的:

让子类的实例同时也具备弗雷泽私有的属性和公共的方法

第一种:原型继承(让子类的原型=父类的实例)

  1. function Parent(){
  2. this.x = 100;
  3. }
  4. Parent.prototype.getX = function getX(){
  5. return this.x
  6. }
  7. function Child(){
  8. this.y = 200
  9. }
  10. Child.prototype = new parent; //原型继承
  11. Child.prototype.getY = function getY(){
  12. return this.y;
  13. }
  14. let a1 = new Child;
  15. console.log(a1)

image.png

第二种继承方式:call继承,只能继承父类私有的,不能继承父类公有的

  1. function Parent(){
  2. this.x = 100;
  3. }
  4. Parent.prototype.getX = function getX(){
  5. return this.x
  6. }
  7. function Child(){
  8. //在子类构造函数中,把父类当作普通方法执行 ,没有父类实例,父类原型伤的东西就和他没关系了
  9. // this child的实例a1
  10. Parent.call(this) //this.x = 100 相当于强制给a1这个实例设置一个私有的属性x,属性值是100,
  11. 相当于让子类的实例继承了父类的私有属性,并且也变为了子类私有的属性‘拷贝式’
  12. this.y = 200
  13. }
  14. Child.prototype = new parent; //原型继承
  15. Child.prototype.getY = function getY(){
  16. return this.y;
  17. }
  18. let a1 = new Child; // new this是当前实例
  19. console.log(a1)

第三种继承:寄生组合式继承(call继承+另类原型继承),父类私有变为子类私有的,父类共有的变为子类共有的

  1. function Parent(){
  2. this.x = 100;
  3. }
  4. Parent.prototype.getX = function getX(){
  5. return this.x
  6. }
  7. function Child(){
  8. Parent.call(this)
  9. this.y = 200
  10. }
  11. Child.prototype = Object.create(Parent.prototype);
  12. Child.prototype.custructor = Child;
  13. Child.prototype = new parent; //原型继承
  14. Child.prototype.getY = function getY(){
  15. return this.y;
  16. }
  17. let a1 = new Child; // new this是当前实例
  18. console.log(a1)

第四种:ES6类和继承

  1. es6中创建的类,不能当作普通函数执行,只能new执行
  2. class Parent(){
  3. construtor(){
  4. this.x = 100
  5. }
  6. //往原型上写方法
  7. getX(){
  8. return this.x
  9. }
  10. }
  11. //继承:entends Parent「类似于寄生组合式继承」
  12. //注意:继承后一定要在construtor第一行加上super
  13. class Child entends Parent{
  14. construtor(){
  15. super() //类似于我们的call继承,super(10,20)相当于把Parent中的construtor执行传两个参数
  16. this.y = 100
  17. }
  18. //往原型上写方法
  19. getX(){
  20. return this.y
  21. }
  22. }
  23. let c1 = new Child
  24. console.logc1