如何理解 JS 的继承?

一.基于原型链的继承

基本原理是:将父类的实例赋值给子类的原型。

 // 父类
 function Staff() {    
   this.company = 'tianchuang';
   this.list = [];
 }
 // 父类的原型
 Staff.prototype.getComName = function() {
  return this.company;
 };

// 子类
     function Coder(name, skill) {
       this.name = name;
       this.skill = skill;
     }

// 继承 Staff
     Coder.prototype = new Staff();

 // 因为子类原型的指向已经变了,所以需要把子类原型的co         ntructor指向子类本身
     Coder.prototype.constructor = Coder;

// 给子类原型添加属性
     Coder.prototype.getInfo = function() {
       return {
         name: this.name,
        skill: this.skill
       };
     };

     let coder = new Coder('小明', 'javascript');

     coder.getInfo(); // {name: '小明', skill: 'javascript'}
     coder.getComName(); // 'tianchuang'

这种继承方式的缺点:

子类的实例可以访问父类的私有属性,子类的实例还可以更改该属性,这样不安全。

二.基于构造函数的继承

原理:在子类构造函数中,使用call来将子类的this绑定到父类中去

   // 父类
  function Staff() {
    this.company = 'tianchuang';
    this.list = [];
  }
  // 父类的原型
  Staff.prototype.getComName = function() {
    return this.company;
  };

  // 子类
  function Coder(name, skill) {
    Staff.call(this);
    this.name = name;
    this.skill = skill;
  }

let coder = new Coder('xiaoming', 'java');
let coder2 = new Coder('zhaosan', 'c');

  coder.getComName(); // Uncaught TypeError: coder.getComName is not a function
  coder.list; //[]
  coder.list.push(1); //[1]
  coder2.list; //[]

三.基于class extend 继承

ES6 中有了类的概念,可以通过 class 声明一个类,通过 extends 关键字来实现继承关系。 class 与 ES5
构造函数的主要区别:

class 只能通过 new 来调用,而构造函数则可以直接调用; class
内部所有定义的方法,都是不可枚举的(non-enumerable)

class Parent {
  constructor(name) {
    this.name = name;
  }
  static say() {
    return 'hello';
  }
}

class Child extends Parent {
  constructor(name, age) {
    super(name); // 调用父类的 constructor(name)
    this.age = age;
  }
}

var child1 = new Child('kevin', '18');

console.log(child1);

原文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老老老老李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值