继承

1.call()

ES6之前并没有给我们提供extends继承。我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承

调用这个函数并且修改函数运行时的this指向

fun. call (thisArg, arg1, arg2, ...)

  • thisArg : 当前调用函数this的指向对象
  • arg1 , arg2 :传递的其他参数
 function fn(x, y) {
     console.log(this);
     console.log(x + y);
}
  var o = {
    name: 'andy'
  };
  fn.call(o, 1, 2);//调用了函数此时的this指向了对象o,
  • call()可以调用函数
  • call()可以修改this的指向,使用call()的时候 参数一是修改后的this指向,参数2,参数3..使用逗号隔开连接

2.子构造函数继承父构造函数中的属性

核心原理:通过call()把父类型的this指向子类型的this , 这样就可以实现子类型继承父类型的属性。

  1. 先定义一个父构造函数
  2. 再定义一个子构造函数
  3. 子构造函数继承父构造函数的属性(使用call方法)
 // 1. 父构造函数
 function Father(uname, age) {
   // this 指向父构造函数的对象实例
   this.uname = uname;
   this.age = age;
 }
  // 2 .子构造函数 
function Son(uname, age, score) {
  // this 指向子构造函数的对象实例
  //3.使用call方式实现子继承父的属性
  Father.call(this, uname, age);
  this.score = score;
}
var son = new Son('刘德华', 18, 100);
console.log(son);

3.借用原型对象继承方法

// 1. 父构造函数
function Father(uname, age) {
  // this 指向父构造函数的对象实例
  this.uname = uname;
  this.age = age;
}
Father.prototype.money = function() {
  console.log(100000);
 };
 // 2 .子构造函数 
  function Son(uname, age, score) {
      // this 指向子构造函数的对象实例
      //3.使用call方式实现子继承父的属性
      Father.call(this, uname, age);
      this.score = score;
  }
// Son.prototype = Father.prototype;  这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会跟着一起变化
  Son.prototype = new Father();
  // 如果利用对象的形式修改了原型对象,别忘了利用constructor 指回原来的构造函数
  Son.prototype.constructor = Son;
  // 这个是子构造函数专门的方法
  Son.prototype.exam = function() {
    console.log('孩子要考试');
​
  }
  var son = new Son('刘德华', 18, 100);
  console.log(son);

如上代码结果如图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • this指向

    这些 this 的指向,是当我们调用函数的时候确定的。调用方式的不同决定了this 的指向不同

    星辰_大海
  • ES6中的对象与类

    面向对象更贴近我们的实际生活,可以使用面向对象描述现实世界事物,但是事物分为具体的事物和抽象的事物

    星辰_大海
  • 对象

    方法:对象里面的函数称为方法,方法不需要声明,使用“对象.方法名()”的方式就可以调用,方法用来描述 该对象的行为和功能。

    星辰_大海
  • 用建造者模式实现链式赋值,代码真清爽

    前段时间写了个项目,一个类的属性那叫一个多啊。刚开始直接写一堆set代码,后来set代码实在是太多了,真心看不下去了,用建造者模式重构了一下,嗯,看起来舒服多了...

    Java识堂
  • 聊聊rocketmq的registerConsumer与unregisterConsumer

    本文主要研究一下rocketmq的registerConsumer与unregisterConsumer

    codecraft
  • 从MDN上的canvas例子受到的启发0.前言1.面向对象编程的实践2.相互纠缠的现象3.解决方案4.模拟核裂变5.大鱼吃小鱼

    在面对碰撞检测后还有后续动作的情况,必须考虑一下相互纠缠的问题: 如果两个小球被检测到碰撞的时候,而且加上他们的速度下一步还是处于碰撞范围内,就像引力一样无法脱...

    lhyt
  • 微信小游戏入门与实战 刷爆朋友圈教程视频

    七月半夏
  • PHP封装的简单连接MongoDB类示例

    本文实例讲述了PHP封装的简单连接MongoDB类。分享给大家供大家参考,具体如下:

    砸漏
  • Quora上的大牛们最喜欢哪种机器学习算法?

    Carlos Guestrin,亚马逊计算机科学机器学习教授,Dato公司ceo及创始人 (Dato原名GraphLab,大数据分析云服务平台)

    大数据文摘
  • Quora上的大牛们最喜欢哪种机器学习算法?

    Carlos Guestrin,亚马逊计算机科学机器学习教授,Dato公司ceo及创始人 (Dato原名GraphLab,大数据分析云服务平台)

    abs_zero

扫码关注云+社区

领取腾讯云代金券