es6中类和extends的本质

发布时间:2019-08-09 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了es6中类和extends的本质脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

理解es6的类和extends的原理,主要是先理解es5里面函数和对象间的关系(__PRoto__和prototype的知识)

class c { 
   constructor(){} 
   //static f() {} 
   a() {} 
} 

class d extends c{
} 

通过typeof打印我们知道,c和d本质其实还是一个函数.接下来我们看最开始的地方c.prototype

es6中类和extends的本质

从图中我们可以看出,我们在class c里面定义的东西其实都是定义在c的prototyPE里的,然后我们再看一下d.__proto__。

es6中类和extends的本质


es6中类和extends的本质

从图中我们可以知道,d的原型proto是等于函数c的,继续,我们看看d的prototype属性

es6中类和extends的本质


es6中类和extends的本质

      从图中我们可以看到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’)//trueObject.prototype.hasOwnProperty.call(d,’f’)//false
d.f访问的f其实是于他的父类c的,这就是d.proto = c的作用。最后还有一个地方是,在c里可以定义getter和setter,比如get a(){},这些和es5里都是一样的,这些属性都会被挂在到c.prototype里面去。

脚本宝典总结

以上是脚本宝典为你收集整理的es6中类和extends的本质全部内容,希望文章能够帮你解决es6中类和extends的本质所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。