Foo.getName()经典面试题
今天去一家公司面试,遇到了个构造函数相关的笔试题,做的不理想,特此记录。
题目:输出以下结果
const { log } = console;
function Foo() {
getName = function () {
log(1);
};
return this;
}
Foo.getName = function () {
log(2);
};
Foo.prototype.getName = function () {
log(3);
};
var getName = function(){
log(4);
};
function getName(){
log(5);
}
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
解析如下
Foo.getName() // 2
// 直接调用函数Foo的静态方法,输出2
getName() // 4
// 1.由于函数提升比变量提升优先级高,导致先执行function
// 2.var getName = function(){...} 覆盖function getName(){...}
// 输出4
Foo().getName() // 1
// 执行Foo(),返回this,this指向undefined,由于非严格模式所以this指向window,window.getName(),输出1
getName() // 1
// 同样window.getName(),输出1
new Foo.getName() // 2
/**
* 将其拆解,相当于
* a = Foo.getName;
* new a();
* 故输出2
*/
new Foo().getName() // 3
// 先执行new Foo(),再执行getName
// 相当于 (new Foo()).getName()
// 1.new Foo()返回一个对象,
// 2.执行该对象prototype上的getName方法
// 输出3
new new Foo().getName() // 3
// 先执行new Foo(),然后getName,最后执行前面的new
// 相当于 new ((new Foo()).getName())
// 第一步得到一个实例对象,this指向该实例对象
// 第二步执行该实例对象prototype上的getName方法
// 第三步new出来得到一个空属性的实例,最后输出3