继承中,this和原型链的区别

11 篇文章 0 订阅

   群里有小伙伴面试遇到这个问题,这个初学js的时候,大家肯定都有研究过。无奈现在大环境都是各种使用第三方插件、框架。导致很多基础的东西都有些淡忘了,在此进行简单的记录与解释。

this继承最经典的当属利用apply与call这两个方法了,方法没什么区别,区别只在于参数是一个还是多个。

function Human(name) {
      this.age = '14'
      this.sex =' boy'
      this.name = name
}

let people = {}
Human.call(people,'emiya')

// ---------------- 以上代码,实现了继承 -------------------

// 因为call调用了Human,并且将this指向了people,那么整个Human的执行过程就为这样:

function Human(name) {
      people.age = '14'
      people.sex =' boy'
      people.name = name
}

简单理解就是,call或者apply方法,可以把所执行方法里面的this替换为你指定的对象(就是所谓的改变this指向)。这样的话,每次继承都会完全创建一些新的值,每个都是独立的。换句话就是说,你即便想复用一些属性也是不行的

原型链继承一般是通过new来实现,如代码所示:

function Human(name) {
        this.age = '14'
        this.sex =' boy'
        this.name = name
    }
Human.prototype.hobby = 'song、jump、rap、basketBall'
let people = new Human('kun')
console.log(people.hobby)   // song、jump、rap、basketBall
Human.prototype.hobby = 'pussy'
console.log(people.hobby)   // pussy

首先我们设置了名为kun的人类,爱好一堆(此处设置为string,是为了防止可能由深拷贝带来误解,众所周知string为基础类型,每次创建或者赋值都会在堆栈中新开创空间)。当我们修改构造函数爱好的时候,kun的爱好也变为pussy。

没有建过多的对象来验证,因为本身是知道的,所以直接记录结论; 原型链继承,最终都是指向原本的构造函数的。也就是说,每次new一个新对象,实际并没有创建多个。

 

通过上面的说明,总结如下:

this所实现的继承是独立的,不会受到父的变化影响。继承多少次,就创建多少次新的属性。

原型链所实现的继承,指向都是指向构造函数的,也就是说所有继承者使用的都是同一个原型属性/方法。

利用这些特性我们在写构造函数的时候,公用方法可以使用原型链,基础属性可以使用this

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值