es6中类和extends的本质

理解es6的类和extends的原理,主要是先理解es5里面函数和对象间的关系(_ proto _和prototype的知识)
class c {
constructor(){}
//static f() {}
a() {}
}
class d extends c{}
通过typeof打印我们知道,c和d本质其实还是一个函数.接下来我们看最开始的地方c.prototype。这里写图片描述
从图中我们可以看出,我们在class c里面定义的东西其实都是定义在c的prototype里的,然后我们再看一下d.proto这里写图片描述
这里写图片描述
从图中我们可以知道,d的原型proto是等于函数c的,继续,我们看看d的prototype属性这里写图片描述
这里写图片描述
从图中我们可以看到d的prototype指向一个c生成的对象。并且我们可以通过打印看到虽然d.prototype指向了c,但是d.pototype.constructor === d是返回true的,这应该是js引擎做了修改,这也和我们平时实现继承时的做法一样。所以es6的继承其实是基于es5的方法的,只是写法变了,语法是为了方便我们写代码,最后由js做转化,但是也加了一些特性。首先有一个地方就是把d.proto指向了c本身,这里有什么用呢,es5的时候d.proto是指向一个function(){}这样的匿名函数。我们平时使用的call和apply就是存在这个匿名函数里的。es6这个做法我觉得应该是为了支持static这个语法。在class c里面定义一个静态的函数f,他的子类d也可以通过d.f去访问,我们把刚开始的那段代码里的注释去掉,通过打印我们可以知道Object.prototype.hasOwnProperty.call(c,’f’)//true
Object.prototype.hasOwnProperty.call(d,’f’)//false
d.f访问的f其实是源于他的父类c的,这就是d.proto = c的作用。最后还有一个地方是,在c里可以定义getter和setter,比如get a(){},这些和es5里都是一样的,这些属性都会被挂在到c.prototype里面去。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值