0%

面试题-函数原型

关于原型函数的问题:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
分析:代码执行 存在var 和匿名函数 所以变量提升 以下函数被提升到顶部;
1
2
3
getName = function(){
console.log(5)
}
函数执行

1) 执行 Foo 的 getName 方法 输出;

1
Foo.getName() // 2;

2) 执行的是 var getName = … 会将提升的函数覆盖;

1
getName() // 4

3) 执行 Foo 函数之后又覆盖 getName, 接着调用 getName 函数,此时调用getName函数;

1
Foo().getName() // 1

4) 执行 getName() 此时函数还是执行上一步的函数;

1
getName() // 1

5) 此函数执行是考察运算符优先级

1
new Foo.getName() // => new (Foo.getName)()  输出 2;

6) 此函数执行同样考察运算符优先级, 但是此时new Foo() 是执行Foo的实例 由于Foo 实例里面没有getName 方法,所以会去原型上找protoType;

1
new Foo().getName() // => (new Foo()).getName() 输出 3

7) 此函数执行同样考察运算符优先级, 是前面两个的综合;

1
new new Foo().getName() // => new ((new Foo()).getName)() // 3
------ 本文结束------