每日两道 面试题
20210825 面试题
function Foo(){
getName = function () {
console.log(1);
}
return this;
}
Foo.getName= function () {
console.log(2)
}
Foo.prototype.getName = function () {
console.log(3);
}
var getName = function () {
console.log(4);
}
function getName(){
console.log(5);
}
Foo.getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
参考答案
1.Foo.getName();
- 调用的是Foo的静态方法, 所以 , 打印2
2.Foo().getName()
- Foo() 就是普通函数调用, 返回的this是window,后面调用的window.getName(),而window下的**getName()在Foo()中调用被getName()**重新赋值, 所以打印1
3.getName()
- 在执行过Foo().getName() 的时候, 把window下的getName() 覆盖了, 所以打印的是1,
- 如果getName() 放在Foo().getName 之前执行, 那么getName() 打印的就是4了。
4.new Foo.getName()
构造器私有属性的getName(),所以打印3
5.new Foo().getName();
- 原型上的getName(), 所以打印3
6.new new Foo().getName();
- 首先new Foo() 得到一个 空对象{}
- 第二步 向空对象中添加一个属相 getName,值为一个函数
- 第三步 new {}.getName();
- 等价于 var bar = new (new Foo().getName)(); console.log(bar)
- 先执行new Foo 得到的实例对象中得getName方法,
再将这个原型上getName方法当做构造函数 继续new
所以执行原型上的方法, 打印3