您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

前台面试必问:javascript原型与继承 《导航网站源码》

  • 时间:2022-09-05 02:16 编辑: 来源: 阅读:301
  • 扫一扫,手机访问
摘要:前台面试必问:javascript原型与继承 《导航网站源码》
比如你准备面试,就看一遍。自己总结一下就一劳永逸了。 本文从以下几个方面入手:0如何理解面向对象1、如何创建对象2记住原型链的技巧3模拟实现的3instanceof新关键字模拟实现5继承实现(逐步实现)0如何理解面向对象其实我也不知道怎么回答这个问题。我只知道面试官问完这个问题后,就意味着他会问一堆继承问题。 以下是引用周老师的话。 “面向对象是一种与面向过程相对应的编程思想。一般所有语言都是面向对象的js,js本身也是基于面向对象构建的。比如JS本身就有很多内置类,Promise就是你可以用new Promise创建一个实例来管理异步编程。 还有vue。通常是创建vue的例子。 “1创建对象的方式1。对象的文字量varo 1 = { name:' O1 ' } varo 2 = new object({ name:' O2 ' })2。通过构造函数varm = function (name) {this。name = name} varo3 = newm ('O3') 3。对象。创建VARO4 =对象。创建(P) 2记住原型链的技巧总是有规律的。比如高中学的三角函数,需要记忆很多公式,强行记忆统一公式很容易混淆。 但核心点背下来,其他公式只需要一点点推导。 原型链也是如此。如果一开始就牢记几点,后面就不会有困惑了。 原型链中的关键概念:构造器,实例,构造器,__ proto__,原型。首先记住他们的关系实例(对象)有proto,实例(对象)没有prototype作为原型构造器。同时,原型是一个对象,那么原型满足上面那个。除了有proto之外,prototype包含constructor构造函数的构造函数是指构造函数本身,也就是上面例子中的M.prototype.constructor === M。请记住,后面总结的完整继承与此密切相关。实际上,构造函数、实例、构造函数、_ _ prototype _ _ prototype之间的关系在上面的例子和三个细节中已经详细说明了。 我们再回头看看构造函数,就是普通的函数,只不过前面多了一个new关键字,生成的对象就是通过new添加构造函数的例子。 以上面生成的o3实例为例O3。_ _ prototype _ = = m.prototype//trueo3.prototype//undefined O3。_ _ prototype _ = = m.prototype//trueo3实例本身没有构造函数,但是会借助原型链向上搜索,也就是O3 . constructor = = = m . prototype . constructor//true O3 . constructor = = = m//true理清这些关键词之间的关系之后,原型链就会清晰很多。3 instanceof模拟实现instance of的原理是什么?我们来看看使用Array // true的[]instance,也就是对象在左边,类型在右边。实例的目的是确定右边类型的原型是否可以在左边实例的原型链上。以下示例显示了[]。_ _ proto _ _ = = array.prototype//truearray.prototype. _ _ proto _ _ = = object.prototype//trueobject.prototype _ _ prototype _//然后按照这个思路实现null的instanceof,你一定会印象更深刻。函数myInstanceof2(left,right){ if(left = = = null | | left = = = undefined){ return false } if(right . prototype = = = left。_ _ proto _ _){ return true } Left = Left。_ _ proto _ _ return my instance of 2(left,right)} console . log(my instance of 2([],array)) 4new模拟实现过程中发生了什么(简写版)new?生成一个空对象,这个空对象的原型被分配给构造函数的原型绑定。这指向返回这个对象。//构造函数m (name) {this。name = name }//Native new var obj = new M(' 123 ')//Simulate function create(){//生成空对象let obj = {} //获取传入参数的第一项,更改参数类数组let Con = []。shift . call(arguments)//为空对象obj的原型点赋值。_ _ proto _ _ = Con . prototype//bind this//(对应以下描述:Con是第一个参数M,// arguments是参数['123'],//是M方法的执行,参数是' 123 ',这是obj) let result = con.apply (obj,arguments)返回对象的结果实例?Result: obj} vartestobj = create (m,' 123') console.log ('testobj ',testobj) 5继承的实现(渐进实现)是一步一步来的,从简单到复杂,可以更直观的发现继承的原理和不足。构造方法的核心是Parent1.call(this) //构造方法是function parent 1(){ this . name = ' parent 1 ' } parent 1 . prototype . say = function(){ alert(' say ')} function child 1(){ parent 1 . call(this)this . type = ' type ' } var C1 = new child 1()C1 . say()//错误:只能继承父构造函数的内部属性,不能继承父构造函数的prototype对象上的属性。思考:call为什么实现继承,call的本质是什么?继承核心child 2 . prototype = new parent 2()/prototype function parent 2(){ this . name = ' parent 2 ' this . arr =[1,2]} parent 2 . prototype . say = function(){ alert(' say ')} function child 2(){//parent 2 . call(this)this . type = ' type ' } child 2 . prototype = new parent 2()var c21 = new child 2()var c21 . say()c21 . arr . push(' 9 ')console . log(' c21 . arr:',c21思考:为什么这样写是同一个参照物?组合1结合了以上两种继承方法的优点,摒弃了函数parent 3(){ this . name = ' parent 3 ' this . arr =[1,2]} parent 3 . prototype . say = function(){ alert(' say ')}函数child 3(){ parent 3 . call(this)this . type = ' type ' } 3 .prototype = new parent3()varc 31 = newchild3()varc 32 = new child 3()c31 . say()c31 . arr . push(' 9 ')console . log(' c31 . arr:',c31.arr) console.log ('c33 A:生成实例,Parent3.call(this),new child 3(),即parent 3执行两次。 组合2将前面示例的Child3.prototype = new Parent3()更改为Child3。原型=父母3。原型缺点:意义重大,不能定义子类构造函数原型的私有方法组合继承优化。3改变孩子3。原型=父母3。原型到孩子3。原型=对象。创建(parent3。prototype)再次出现在上面的例子中,所有的问题都将迎刃而解。 因为Object.create的原理是生成一个对象,而这个对象的proto指向传递的参数。 思考:能有疏漏吗?如果一时想不起来可以看看这些结果console . log(c31 instance of child 3)//True console . log(c31 instance of parent 3)//True console . log(c31 . constructor = = child 3)//True console . log(c31 . constructor = = = parent 3)//True所以回想一下文章开头提到的需要牢记的几点,需要重新赋值子类构造函数的构造函数:child 3 . prototype . constructor = child 3,完整版如下 2]} parent 3 . prototype . say = function(){ alert(' say ')} function child 3(){ parent 3 . call(this)this . type = ' type ' } child 3 . prototype = object . create(parent 3 . prototype)child 3 . prototype . constructor = child 3 var C31 = new child 3()var C31 . say()C31 . arr . push(' 9 ')console . log(' C31 . arr:',c31.arr)console.log('c31.arr:',c32.arr)console 继承的class parent { constructor(name){ this . name = name } getname(){ return this . name } } of constructor = = parent 3)5es 6 class child { constructor(age){ this。age = age } get age(){返回此。age}} ES6继承记住几个注意事项:1构造函数不能像普通函数一样执行Parent()。它将报告一个错误。2不允许重定向原型child . prototype = object . create(parent . prototype)。没用。3继承是这样写的。上面的子类想要继承父类。把它改成下面的写法就行了


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部