为了账号安全,请及时绑定邮箱和手机立即绑定

一道前端面试题

一道前端面试题

ABOUTYOU 2019-05-24 09:48:56
functionPerson(){getAge=function(){console.log(10);}returnthis;}Person.getAge=function(){console.log(20);}Person.prototype.getAge=function(){console.log(30);}vargetAge=function(){console.log(40);}functiongetAge(){console.log(50);}Person.getAge();//20Person的静态方法getAge();//40函数的预处理函数表达式覆盖了函数声明Person().getAge();getAge();newPerson.getAge();newPerson().getAge();以下是不太懂的地方,不知道自己的理解是否正确。Person().getAge();//10普通的函数调用?getAge();//不懂为什么输出10newPerson.getAge();//也是Person的静态方法调用?newPerson().getAge();//30//newPerson()返回一个Person实例,沿着原型链寻找,打印30?//Person里本身就有getAge()方法,为什么还会去原型链上寻找?
查看完整描述

2 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

Person().getAge();//10普通的函数调用?
(对就是普通的函数调用)
getAge();//不懂为什么输出10
(因为上面的函数调用,让全局变量getAge指针发生了变化,指向了新函数)
newPerson.getAge();//也是Person的静态方法调用?
(这个是构造函数调用,创建了一个Person.getAge的实例)
newPerson().getAge();//30
//newPerson()返回一个Person实例,沿着原型链寻找,打印30?
//Person里本身就有getAge()方法,为什么还会去原型链上寻找?
(这个是构造函数调用,创建了一个Person的实例,而Person上面是没有getAge这个方法的,
所以从原型链上找。Person中的那个getAge不是它的属性,那是一个全局变量,可以说是window的属性。
你可以试一下window.getAge();//10)
                            
查看完整回答
反对 回复 2019-05-24
?
繁花如伊

TA贡献2012条经验 获得超12个赞

Person().getAge();//10普通的函数调用?确实是普通的函数调用,但要明白returnthis此时返回的是window,因为Person().getAge()实际上是window.Person().getAge(),所以this指的是window。现在分析getAge()那个更有效;1.你上面说的函数的预处理函数表达式覆盖了函数声明,其实说成变量提升更准确,就是function比var更先声明,所以var会覆盖function声明的getAge(),到目前为止应该打印40。2.但到这里并没有结束,为什么没有输出40,是输出10,是因为Person中又有一个函数表达式,按理说,这个方法只应在person中调用有效,但眼睛需要放光的是这个函数表达式没有var声明,说明这个getAge是直接挂载到window下面的,所以window.getAge()此时就打印了10.这也是为什么下一步的getAge会打印10;不信,你可以在getAge前面添加个var试试。getAge();//不懂为什么输出10看上面2的描述newPerson.getAge();//也是Person的静态方法调用?嗯,new不new无所谓newPerson().getAge();//30这个上面都说了,而且描述正确。理解构造方法Person()带new和不带new的区别就行。前者只是普通的函数调用,后者会创建一个新的实例,并将this指向这个实例
                            
查看完整回答
反对 回复 2019-05-24
  • 2 回答
  • 0 关注
  • 515 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信