搜了下经典的Foo和getName的题目,看了几个解释,懒得看,自己解一下,作为笔记。
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的静态方法 Foo.getName();//2 //function getName有提前声明的规则,声明后被var getName= 。。覆盖,则getName为4 getName();//4 //Foo()的return this为window,window.getName 在Foo里面被覆盖,则输出1 Foo().getName();//1 //同上,因调用了Foo();window的getName被覆盖 getName();//1 //依然只是调用了Foo对象上的getName,又因为Foo.getNname,所以相当于 /** * function a(){console.log(2)}; * new a(); * **/ new Foo.getName();//2 //先执行了new Foo();返回一个对象,这个对象的getName为prototype上的getName,相当于(new Foo()).getName(); new Foo().getName();//3 // new new Foo().getName();//3
对于后三题,尤其是最后一个new new Foo().getName(),特别容易懵x
对于带new的输出,用一个this来跟踪。
function Foo(){ this.a = 1; getName = function(){ this.a = 11; console.log(1); }; return this; } Foo.getName = function(){ this.a = 2; console.log(2); } Foo.prototype.getName = function(){ console.log(3); this.a = 3;
return "i'm prototype's getName"; } var getName = function(){ console.log(4); this.a = 4; } function getName(){ console.log(5); this.a = 5; } //相当于 new (Foo.getName()) var a1 = new Foo.getName();//2 console.log(a1.a);//2;
//相当于 (new Foo()).getName(); 只是执行了一个prototype里getName()的方法,
//这个方法若无返回则a2为undefined,
//可以进一步确定,在prototype.getName中添加return ,则a2会等于return出来的结果 var a2 = new Foo().getName();//3
console.log(a2.a);//报错:cannot read property a of undefinded;
//这题输出的结果为3;从结果上看,相当于 new Foo.prototype.getName()
//也就是说new Foo().getName() == Foo.prototype.getName()
//所以执行的结果应该相当于 new ((new Foo()).getName())
//这句话用通俗点说法就是,new了一个Foo对象A,然后以A原型里的getName()方法作为构造函数new了B,最后这个B.a = 3;
//当然在new的时候执行构造器,就输出了3;
var a3 = new new Foo().getName();//3
console.log(a3.a);//3