一道多数人都会错的前端面试题
1 | function Foo(){ |
result
- Foo.getName() //2
- new Foo.getName() //2
- new Foo.getName //2
- Foo().b //Cannot read property ‘b’ of undefined
- Foo.b //undefined
- Foo().getName() //Cannot read property ‘getName’ of undefined
- new Foo().getName() //3
Foo.getName()
这个很简单就是直接取Foo函数对象上的getName,自然是2
new Foo.getName()
这个其实是new (Foo.getName)(),首先new Foo.getName()执行过程:
- 一个继承自 Foo.prototype 的新对象被创建。
- 使用指定的参数调用构造函数 Foo ,并将 this 绑定到新创建的对象。new Foo 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用的情况。
- 由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)
new Foo.getName
同上
Foo().b
Foo()执行后没有任何返回结果
Foo.b
Foo.b上面是没有对应的b属性,上面函数中对应的this是指向window的
Foo().getName()
Foo()执行后没有任何返回结果
new Foo().getName()
new Foo()首先返回Foo类实例对象,然后查找当前对象上的getName函数,没有则上prototype查找