一道有意思的题

54 阅读1分钟
function Foo() {
    getName = function () { alert (1); };
    return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
 
//请写出以下输出结果:
Foo.getName(); //2
getName(); //4
Foo().getName(); //1
getName(); //1
new Foo.getName(); //2
new Foo().getName(); //3
new ((new Foo()).getName)(); //3

进阶版

function Foo() {
    this.getName = function() {
        console.log(3);
        return {
            getName: getName
        }
    };
    getName = function() {
        console.log(1);
    };
    return this
}

//请写出以下输出结果:
Foo.getName = function() { console.log(2); };
Foo.prototype.getName = function() { console.log(6); };
var getName = function() { console.log(4); };
function getName() { console.log(5); }

Foo.getName(); //2
getName(); //4
console.log(Foo()) //window
Foo().getName(); //1
getName(); //1
new Foo.getName();  //2
new Foo().getName(); //3
//多了一问
new Foo().getName().getName(); //3 1
new new Foo().getName(); //3

这道题的有趣之处在于它综合考察了,包含变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级等知识