一道前端面试题

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();//不懂为什么输出10
newPerson.getAge();//也是Person的静态方法调用?
newPerson().getAge();//30
//newPerson()返回一个Person实例,沿着原型链寻找,打印30?
//Person里本身就有getAge()方法,为什么还会去原型链上寻找?
ABOUTYOU
浏览 516回答 2
2回答

慕雪6442864

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)

繁花如伊

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指向这个实例
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript