ES5 寄生组合式继承

原型链

学习ES5继承需要先理解javaScript的原型链原型链图示

  1. 每一个对象都有__proto__属性 指向该对象的 原型对象
  2. 每一个函数(每个函数都是构造函数也是对象) 都有一个 prototype(对象原型) 属性 指向该函数的 原型对象
  3. 原型对象通过 constructor 属性指向该对象的构造函数
  4. 原型对象也是对象 也有__proto__属性 指向Object 的 原型对象
  5. Object 为顶级对象 object 的 __proto__属性 指向为null
    以上为个人理解 欢迎指正
    Object.getPrototypeOf() 获取原型对象的内置方法 __proto__属性为浏览器默认属性 在非浏览器环境下可能失效

ES5寄生组合式继承

// 定义父类(构造函数)
  const Father = function (name, age, talk) {
    this.name = name
    this.age = age
    this.talk = talk
    this.speak = function () {
      console.log('father Talk' + this.talk)
    }
  }
// 在父类原型上添加run方法
  Father.prototype.run = function () {
    console.log('father Run')
  }

//定义子类
  const Sun= function (like) {
  //等于 把Father构造函数内容 写在子类里 但是父类原型上的内容 无效
  // call 改变this指向并执行函数
  // 静态属性已继承 实例属性未继承
    Father.call(this, '父亲名字', '父亲年龄', '父亲说') 
    this.like = like
  }

// 定义一个方法 继承父类原型上的属性
  const extend = function (Z, F) {
  // 这里本意是 将父类的原型对象 赋值给子类 直接'='赋值为引用类型 使用Object.create 创建新对象
    Z.prototype = Object.create(F.prototype)
    // 上一步修改了子类构造函数 再改回来(不能把根丢了)
    Z.prototype.constructor = Z 
  }

  extend(Sun, Father)

  const classZ = new Sun('web')
  const classF = new Father('name', 'age', 'talk')

  console.log(classF)
  console.log(classZ)
  classZ.run() // 子类中调用父类的方法
  classZ.speak()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

绝知芳誉亘千乡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值