JavaScript 中的继承

本文探讨了在Vue框架中使用Prototype链和ES6 Class进行继承的方法。通过具体示例,展示了如何通过Prototype向Vue添加自定义方法,并比较了Class继承的实现方式。深入理解这两种继承模式有助于开发者更灵活地扩展Vue的功能。
prototype 继承

万物皆对象;对象皆有 prototype(原型),prototype 也有 prototype (原型链);在执行某个方法时,如果在 对象中没有找该方法就会 查找原型链 (在prototype上继续查找)
通过 Vue 简单叙述一下

<div class="container" v-cloak>
    <button>{{btnText}}</button>
</div>

通过 prototype 继承

// 通过原型链向 Vue 添加 test 函数
Vue.prototype.test = function(name, fn = () => {}){
  fn.call(this, name)   // 改变了 this 指向
}
var vm = new Vue({
  el: '.container',
  data: {
    btnText: '按钮'
  },
  mounted() {
    // 在 Vue 中本身没有 test 方法
    this.test('name', function(res){
      // 因为在 test 中改变了 this 的指向,所以该处的 this 依旧是 Vue 实例 按钮会被改变
      // 如果 test 中没有改变 this 指向问题,那么这个 this 则是 window 对象
      this.btnText = '按钮被改变了'
    })
  }
})
类继承

HTML 代码不变
ES6 class 继承

class Test extends Vue {
  /* 
  *  注意 Test 的定义也是class关键字实现的,而extends则表示原型链对象来自Vue。
  *  子类的构造函数可能会与父类不太相同,例如,Test需要name和tag两个参数,
  *  并且需要通过super(name)来调用父类的构造函数,否则父类的name属性无法正常初始化。
  */
  constructor(name, tag){
    super(name)
    this.tag = tag
  }
   
  test(name, fn){
    fn.call(this, name)
  }
}
var vm = new Test({
  el: '.container',
  data: {
    btnText: '按钮'
  },
  mounted() {
    this.test('name', function(res) {
      // this 指向的是 Test
      console.log(this)
      this.btnText = '按钮被改变了'
    })
  }
})

Test 继承了 Vue 中属性 方法, 用别人的框架,new 自己的构造函数,ennnn… 感觉应该会被揍的不轻吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值