很多人都会错的面试题

一道多数人都会错的前端面试题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Foo(){
this.b = 10
getName = function() {
console.log(1)
}
}
Foo.getName = function() {
console.log(2)
}
Foo.prototype.getName = function() {
console.log(3)
}
Foo.getName()
new Foo.getName()
Foo().b
Foo.b
Foo().getName()
new Foo().getName()

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查找