题目
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)
}上述题目在正常运行的时候会遇到变量提升的影响,将变为一下顺序
var getName = function () {
console.log(4);
}
function getName () {
console.log(5}
}
function Foo(){
getName = function () {
console.log(1);
};
return this;
};
Foo.getName = function () {
console.log(2);
};
Foo.prototype.getName = function () {
console.log(3);
};
练习题
Foo.getName(); // 2就是找到定义就好了
getName();// 4 程序顺序执行,第一个就是变量声明的var getName 所以答案就是 4
Foo().getName();// 1 首先执行 Foo 函数,返回出调用该函数的window对象,同时在该函数执行的时候替换了原有的getName 定义,所以就是 1
getName();// 1 第一种:受到上一题的影响,此时的getName 是 Foo函数中的getName 那么答案是 1
第二种:不是在上一题的执行之后执行此题,那么答案是 4
接下来的考察 运算符的优先级
new Foo.getName();// 2 点运算高于new无参运算,所以 首先是 Foo.getName() 为 2 ,然后new 一下,所以答案是 2
new Foo().getName();// 3 同理点运算高于new带参数运算,点运算要从左至右运算,那么 new Foo()就是 Foo 函数的一个实例,那么接下来就是点运算咯,实例的getName 方法就是原型上的方法喽,即
Foo.prototype.getName 此时答案为 3 。
new new Foo().getName();同上一题相同,只是在点的左边分为带参数的new Foo() 和 不带参数的 new new Foo(),此时题目变为new ( new Foo() ).getName() ,就成为了 new Foo的实例 .getName , 用foo 代替 new Foo 的实例 为 new foo . getName(),此时已经和上题相同了,那么答案为3。
注意此时的this 指向是Foo的实例对象。