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 new Foo().getName();
以上的输出结果是什么?
1、Foo.getName();//2
解释:这个应该没问题,直接访问原型属性,属性方法返回结果
2、Foo().getName();// 1
解释:执行Foo函数,getName是全局属性,返回的this指向window,相当于执行window.getName(),输出 1
3、getName();//1
解释 :
一、 先看getName
的声明有处,按定义先后顺序:
-
var
关键字声明了一个全局getName
-
function
关键字声明了一个全局getName
-
Foo
构造函数中声明了一个全局getName
二、分析输出结果:
-
var(函数表达式)
和function(函数声明)
都存在变量提升,提升后的结果是这样的
var getName;
function getName () {
console.log(5);
}
getName = function () {
console.log(4)
}
// 这时window.getName输出4
- 上一步执行了
Foo()
,将window.getName重新定义了,所以getName输出1
4、new Foo.getName();//2
解释: 通过new
来返回一个 Foo.getName
的实例,就相当于Foo.getName
是一个构造函数,可以通过以下方法验证
var bar = new Foo.getName();
bar.__proto__.constructor === Foo.getName //true
5、new new Foo().getName();
解释:按照new操作符拆分一下就是new ( (new Foo()).getName )();
var a = new Foo();
var b = a.getName; // a.getName 指向Foo.protoType.getName
new b(); // 3